3

querydsl と DTO:s に関する問題があります

私はいくつかのクエリオブジェクトを持っています:

QPerson person = QPerson.person;
QExamCode examCode = QExamCode.examCode;
QExamGrade examGrade = QExamGrade.examGrade;
QProgram gradeProgram = examGrade.program;

それらから、CompletedCreditsSummary と呼ばれる DTO クラス (エンティティではない) のインスタンスをクエリして一覧表示しようとします。CompletedCreditsSummary には、Long、Long、Float を取るコンストラクタがあります。

JPQLQuery query = new JPAQuery(manager);
query = query.from(person, examCode, examGrade);
query = query.where(person.studies.examGrades.contains(examGrade).and(examGrade.examCode.eq(examCode)).and(examGrade.passed.isTrue()));

私はこれを行うことができます (group by を使用せず、CompletedCreditsSummary を使用して、個人およびプログラム オブジェクトを作成できるようにするために必要なすべてのパラメーターを要求します。この場合は、person.id および program.id に簡略化されます)。

ConstructorExpression.create(CompletedCreditsSummary.class,person.id,program.id,examCode.credits);

return   query.list(completedCreditsSummaryExpression);

これは機能します。しかし、これをクエリに追加したい場合:

query.groupBy(person, examGrade.program);

そして、examCode.credits.sum() で CompletedCreditssummary を作成します。

ConstructorExpression.create(CompletedCreditsSummary.class,person.id,gradeProgram.id,examCode.credits.sum());

それ以外の

ConstructorExpression.create(CompletedCreditsSummary.class,person.id,gradeProgram.id,examCode.credits);

java.lang.IllegalArgumentException: 引数の型が一致しません。

ここでの質問は、examCode.credits (NumberPath) と Examcode.credits.sum() (NumberExpression) の違いと、問題を解決するために何ができるかです。

試行錯誤しながらquerydslを学んでいるので、おそらく見落としている基本的なことがあります。本当に助けていただければ幸いです!

よろしくラスムス

編集:できれば、このようなものが機能することを望みます(group byおよびCompletedCreditsSummaryコンストラクターを使用して、Person、Program、Floatを使用します):

ConstructorExpression<Person> personExpression = ConstructorExpression.create(Person.class,person.id);
ConstructorExpression<Program> programExpression = ConstructorExpression.create(Program.class,gradeProgram.id);
ConstructorExpression<CompletedCreditsSummary> completedCreditsSummaryExpression = ConstructorExpression.create(CompletedCreditsSummary.class,personExpression,programExpression,examCode.credits.sum());

編集: CompletedCreditsSummary コンストラクターが受け入れられるようにすることで動作するようになりました: Long、Long、Number。つまり、Float を Number に変更しました。これは理想的な解決策ではありませんが、少なくとも機能します。

4

1 に答える 1

3

このようなものを試してください

JPAQuery query = new JPAQuery(manager);
query.from(person, examCode, examGrade)
  .where(
    person.studies.examGrades.contains(examGrade),   
    examGrade.examCode.eq(examCode),
    examGrade.passed.isTrue())
  .groupBy(person, examGrade.program)
  .list(ConstructorExpression.create(
    CompletedCreditsSummary.class, 
    person, examGrade.program, examCode.credits.sum()));

クラスの後のConstructorExpressionの引数が、呼び出すコンストラクターの引数と互換性があることを確認する必要があります。エンティティをIDに置き換えると、問題が発生しました。

于 2012-06-27T13:41:34.427 に答える