重构这个java sql代码片段

时间:2014-07-24 19:17:14

标签: java sql refactoring

我想将这两个sql查询合并为1,这可能吗?不幸的是,我不是SQL专家。

我目前带有2个查询的代码段如下:

if(myFlag.equals("") || isFlagPirate.equals("N")){

    //get list of available ship id, ship name as options for the ship dropdown list
    sqlShipListString =
            "select distinct ship.ship_id, ship.name from admiralty_branch  " +
                    "left join ship on ship.ship_id=admiralty_branch.ship_id " +
                    "where admiralty_branch_id= " + admiraltyid +
                    " order by ship.name";

}else{

    if(isFlagPirate.equals("Y")){           

        //get list of available ship id, ship name as options for the ship dropdown list
        sqlShipListString =
                "select distinct ship.ship_id, ship.name from ship  " +
                        "left join ship_type on ship.ship_id=ship_type.ship_id " +
                        "left join fleet on ship_type.fleet_id=fleet.fleet_id " +
                        "where fleet_id= " + fleetId +
                        " order by ship.name";
    }
}

根据要求,表格结构:

**ship**
ship_id
name

**admiralty_branch**
admiralty_branch_id
ship_id

**ship_type**
ship_id
fleet_id

**fleet**
fleet_id

1 个答案:

答案 0 :(得分:0)

这是一个丑陋的解决方案。海盗的2个左连接与非海盗的1连接使得模式有所不同。我不会重构这两个查询。如果你有更多,你可以考虑创建某种类型的sqlbuilder。

public String getSql(String isFlagPirate)
{
    if(myFlag .equals("") || isFlagPirate.equals("N")){

        //get list of available ship id, ship name as options for the ship dropdown list
        return
                buildSql("admiralty_branch  ", "ship on ship.ship_id=admiralty_branch.ship_id ", 
                        "admiralty_branch_id", admiraltyid);

    }else{

        if(isFlagPirate.equals("Y")){           

            //get list of available ship id, ship name as options for the ship dropdown list
            return buildSql("ship  ", "ship_type on ship.ship_id=ship_type.ship_id left join fleet on ship_type.fleet_id=fleet.fleet_id ",
                    "fleet_id", fleetId);
        }
        return "";
    }
}

protected String buildSql(String table, String leftjoin, String whereFieldName, String whereFieldValue)
{
    return "select distinct ship.ship_id, ship.name from "+table +
            "left join "+leftjoin +
            "where "+whereFieldName+"= " + whereFieldValue +
            " order by ship.name";
}