2016-09-25 13 views
3

私はhttp://openhms.sourceforge.net/sqlbuilder/からJavaとSQLBuilderを使用していますし、dynamicly SQL SELECTクエリを構築しようとしています:sqlbuilderを使用してSELECTクエリを作成する方法は?

SelectQuery sql = new SelectQuery(); 
sql.addAllColumns().addCustomFromTable("table1"); 
sql.addCondition(BinaryCondition.like("column1", "A")); 

しかし、それはこのような文字列作成されます。そのため間違った引用符('column1')の

SELECT * FROM table1 WHERE ('column1' LIKE 'A') 

を、それは正しく動作しません。私はそれが.like()メソッドのいくつかのColumnオブジェクトを期待していると思います。 適切な引用符でクエリを作成する方法はありますか?

+1

あなたは、列オブジェクト型を使用する必要があります代わりに "column1" String –

+0

@ SergeiPodlipaevはい、私はすでにそれを解決しました。とにかくありがとう –

答えて

0

私は解決策を見つけました。その後、

public class Column extends CustomSql { 
    public Column(String str) { 
     super(str); 
    } 
} 

そして:私はCustomSqlを拡張する新しいクラスColumnを作成し、パラメータとして、私の列名を渡すために持っていた

SelectQuery sql = new SelectQuery(); 
sql.addAllColumns().addCustomFromTable("table1"); 
sql.addCondition(BinaryCondition.like(new Column("column1"), "A")); 

それとも独自のクラスを作成せず:

SelectQuery sql = new SelectQuery(); 
sql.addAllColumns().addCustomFromTable("table1"); 
sql.addCondition(BinaryCondition.like(new CustomSql("column1"), "A")); 

それが作成されます次のSQLクエリが正常に動作します。

SELECT * FROM table1 WHERE (column1 LIKE 'A') 
0

BinaryCondition.like()はColumn ObjectのObjectを取り込み、内部でConverter.toColumnSqlObject(Object)を使用してSqlObjectに変換されます。単純なStringオブジェクトを渡すことができるfindColumn(String columnName)findSchema(String tableName)というメソッドがそれぞれClass DbTableClass DbSchemaにあります。これを試して問題を解決してください:

DbTable table1= schema.findSchema("table1"); 
DbColumn column1 = table1.findColumn("column1"); 

SelectQuery sql = new SelectQuery(); 
sql.addAllColumns().addCustomFromTable(table1); 
sql.addCondition(BinaryCondition.like(column1, "A")); 
+0

データベースの作成に 'DbSchema'を使用しませんでした。私は1つのクエリを構築する必要があります。出来ますか? –

0

してください、実施例をチェックして、独自のクエリをリファクタリング

String query3 = 
     new SelectQuery() 
     .addCustomColumns(
      custNameCol, 
      FunctionCall.sum().addColumnParams(orderTotalCol)) 
     .addJoins(SelectQuery.JoinType.INNER, custOrderJoin) 
     .addCondition(BinaryCondition.like(custNameCol, "%bob%")) 
     .addCondition(BinaryCondition.greaterThan(
         orderDateCol, 
         JdbcEscape.date(new Date(108, 0, 1)), true)) 
     .addGroupings(custNameCol) 
     .addHaving(BinaryCondition.greaterThan(
        FunctionCall.sum().addColumnParams(orderTotalCol), 
        100, false)) 
     .validate().toString(); 
+0

この例では、スキーマオブジェクトを使用してデータベースを作成したと仮定していますが、クエリを1つだけ作成する必要があります。私の答えを見る –

0

このライブラリJDSQLを見(これは、Java 8が必要です):

JQuery jquery = new JQuery(); 
    Collection<Map<String, Object>> result = jquery.select("tbl1::column1", "tbl2::column2") //Select column list 
               .from("Table1" , "TB1") // Specifiy main table entry, and you can add alias 
               .join("Table2::tb2") // Provide your join table, and another way to provide alias name 
               .on("tbl1.key1", "tbl2.key1") // your on statement will be based on the passed 2 values equaliy 
               .join("Table3", "tbl3", true) // Join another table with a flag to enable/disable the join (Lazy Joining) 
               .on("tbl2.key2", "tbl3.key1", (st-> {st.and("tbl3.condition = true"); return st;})) 
               .where("tbl1.condition", true, "!=") // Start your where statment and it also support enable/disable flags 
               .and("tbl2.condition = true", (st-> {st.or("tbl.cond2", 9000, "="); return st;})) // And statment that is grouping an or inside parentheses to group conditions 
               .and("tbl3.cond3=5", false) // And statment with a flag to enable/disable the condition 
               .get((String sql, Map<String, Object> parameters)-> getData(sql, parameters)); // Passing the hybrid getter. 
                   //You can also assign the getter at the jqueryobject itself by calling setGetter. 
} 

private static Collection<Map<String, Object>> getData(String sql, Map<String, Object> parameters){ 



    return null; 

} 

}

関連する問題