用Querydsl和ConstructorExpression.create()构造DTO:s

时间:2012-06-27 12:54:16

标签: java querydsl

我遇到了涉及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()));

我能够做到这一点(没有分组和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时,我可能忽略了一些根本性的东西。非常感谢任何帮助!

关心Rasmus

编辑:我最好这样做(使用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。这不是一个理想的解决方案,但至少它可行。

1 个答案:

答案 0 :(得分: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替换实体会导致你的问题。