【问题标题】:Constructing DTO:s with Querydsl and ConstructorExpression.create()使用 Querydsl 和 ConstructorExpression.create() 构建 DTO:s
【发布时间】:2012-06-27 12:54:15
【问题描述】:

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

【问题讨论】:

    标签: java querydsl


    【解决方案1】:

    试试这样的

    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 替换实体会导致您的问题。

    【讨论】:

    • 感谢您的回答。我现在看到我遗漏了一个重要的细节。 completedCreditsSummary 采用所有必要的参数来创建人员和程序对象。这是我让它工作的唯一方法。我已将问题(列表工作和不工作之间的差异)缩小到examCode.credits(没有groupby)工作。和examCode.credits.sum()(带分组)不起作用。并澄清: CompletedCredits 构造函数需要:Long, Long, Float 但我希望它处理 Person,Program,Float
    • 也许您需要加入examcode.credits 才能在投影中使用它。我不明白你对构造函数的问题。
    • 我让它与 CompletedCreditsSummary 在其构造函数中接收数字而不是浮点数一起工作。似乎 sum() 的返回值不能解释为浮点数。甚至 sum().floatValue() 也不返回浮点数。这不应该有效吗?
    • @Rasmus 我无法重现 Float 参数的问题。您能否将堆栈跟踪发布在 Querydsl 项目的 GitHub 票证中?
    • 好的,我一有时间就会这样做。
    猜你喜欢
    • 2014-02-15
    • 2011-12-25
    • 2017-04-08
    • 1970-01-01
    • 2021-04-11
    • 1970-01-01
    • 2014-07-13
    • 1970-01-01
    • 2018-04-11
    相关资源
    最近更新 更多