我有一个涉及 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 使其工作。那就是我将浮点数更改为数字。这不是一个理想的解决方案,但至少它有效。