1

Predicateメソッドは、後でデータベース サービス オブジェクトに渡される のリストを動的に作成しています。述語リストに基づいてテーブル結合を作成するには、各述語の基になる生成クラス Q* を決定する必要があります。getType()または述語を呼び出すgetClass()ことは役に立ちません。

これは私が述語を構築する方法です:

Class<?> tableClazz = Class.forName("foo.bar.database.model.Q"+ WordUtils.capitalize(tableName));
Object tableObj = tableClazz.getConstructor(String.class).newInstance(tableName +"1000");
Field colField = tableClazz.getDeclaredField(fieldName);
Object colObj = colField.get(tableObj);
// method name is one of eq, ne, like...
Method m = colObj.getClass().getMethod(methodName, classParam );
return (Predicate) m.invoke(colObj, operand);

クエリ構築コード:

JPAQuery query = new JPAQuery(entityManager);
query = query.from(company);
for(Predicate p : predicates){
   // if there's at least one predicat with the underlying db class Foo:
   query = query.join(company.foos, new QFoo());
   break;
}
List<Object[]> rows = query.where(predicates.toArray(new Predicate[0])).listDistinct(company.id);
4

1 に答える 1

2

生成された Q タイプを動的な式の作成に使用しないでください。代わりに動的パスを使用できますhttp://www.querydsl.com/static/querydsl/2.9.0/reference/html/ch03.html#d0e1379

あなたの場合、このようなもの

Class<?> entityType = Class.forName(...)
PathBuilder entityPath = new PathBuilder(entityType, "entity");
PathBuilder relation = entityPath.get("relation");
Predicate predicate = relation.get...(...).eq(...)

パス抽出には、このクラスhttp://www.querydsl.com/static/querydsl/2.9.0/apidocs/com/mysema/query/types/PathExtractor.htmlを使用します

PathExtactor与えられたパスから最初のパスを抽出しますExpression

于 2013-03-07T12:00:47.920 に答える