java expression 用法_java-使用Querydsl和ConstructorExpression.create()构造DTO:s

我有一个涉及querydsl和DTO的问题:

我有一些查询对象:

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 personExpression = ConstructorExpression.create(Person.class,person.id);

ConstructorExpression programExpression = ConstructorExpression.create(Program.class,gradeProgram.id);

ConstructorExpression completedCreditsSummaryExpression = ConstructorExpression.create(CompletedCreditsSummary.class,personExpression,programExpression,examCode.credits.sum());

编辑:通过让CompletedCreditsSummary构造函数接受它来使其工作:Long,Long,Number.那就是我将Float更改为Number.这不是一个理想的解决方案,但至少可以起作用.

解决方法:

试试这个

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替换实体会引起您的问题.

标签:java,querydsl

来源: https://codeday.me/bug/20191201/2078548.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值