10

jOOQ を使用して、一般的なコードで SQL クエリを作成しようとしています。jOOQ を使用してこれらのクエリを実行したり、結果を調べたりすることに興味はありません。また、このコードは汎用的であるため、jOOQ のコード生成は使用できません。

私はこれを理解することができました:

List<org.jooq.Field<?>> fields = new ArrayList<org.jooq.Field<?>>();
Field<?> field = Factory.field("somefield");
fields.add(field);
field = Factory.field("someotherfield");
fields.add(field);

Field<Object> fieldPK = Factory.field("somePKField"); 
Condition condition = fieldPK.equal(123);

Factory factory = new Factory(connection, SQLDialect.POSTGRES);
SelectFinalStep step = factory.select(fields).from("sometable").where(condition);
String query = step.getQuery().getSQL(true);

しかし、Factory.field() と from() は、実際のテーブルやフィールド名ではなく一般的な SQL を使用するため、(RenderNameStyle.QUOTED を使用している場合でも) 引用符がなく、SQL インジェクションに対する保護もありません。

それらの名前が何であるかを知っているフィールドまたはテーブルを作成する方法はありますか? 理想的には、jOOQ が "sometable"."somefield" 文字列を作成して、その名前とその親テーブルの両方で Field を指定できます。

4

1 に答える 1

25

jOOQ は、org.jooq.Name識別子をモデル化する型を認識しています。DSL.name(String...)これは、文字列形式の完全修飾名から構築できます。次に例を示します。

Name name1 = name("column");
Name name2 = name("table", "column");
Name name3 = name("schema", "table", "column");
Name name4 = name("catalog", "schema", "table", "column");

次に、そのような名前をDSL.field(Name)コンストラクターに渡すことができます。

Field<Object> field1 = field(name("table", "column"));
Field<String> field2 = field(name("table", "column"), String.class);

jOOQ版について

補足: この質問は jOOQ 2.x のコンテキストで行われましたが、この古いバージョンをまだ使用している人はほとんどいないため、この回答では jOOQ 3.x の使用を前提としています。

于 2012-04-22T10:12:36.997 に答える