【问题标题】:Java QueryDSL 3.6.0 Projection.bean(Person.class, person.firstName, person.count())Java QueryDSL 3.6.0 Projection.bean(Person.class, person.firstName, person.count())
【发布时间】:2017-03-30 10:19:39
【问题描述】:

我在我的项目中使用 QueryDSL 来返回 Person groupBy LastName 的列表,并且没有具有该 lastName 的人的列表。下面是Person.java

@Entity
class Person {
     private String firstName;
     private String lastName;
     private boolean isCitizen;
     private int age;
     private int groupByCount; //Property to return groupByCount - could use Group tuple for this, but doing a research trying to set it as an object field.

     //Constructors to support n! ways of object creation - where n is no of fields in the object
     public Person(String lastName, int groupByCount){
       this.lastName = lastName;
       this.groupByCount = groupByCount;
     }

     public Person(int age, int groupByCount){
       this.age = age;
       this.groupByCount = groupByCount;
     }

     public Person(boolean isCitizen, int groupByCount){
       this.isCitizen = isCitizen;
       this.groupByCount = groupByCount;
     }

     // keeps going to cover all possible constructors - i want to avoid this for maintainability reasons - want to be able to build objects dynamically with different parameters

     //Below is code for Getter and setters for above fields
}

使用这些构造函数的 QueryDSL 查询如下。

personRepo.getQueryDSL().createQuery(person).groupBy(person.lastName)
.list(Projections.constructor(Alarm.class, person.lastName, person.count());

personRepo.getQueryDSL().createQuery(person).groupBy(person.age)
.list(Projections.constructor(Alarm.class, person.age, person.count());

personRepo.getQueryDSL().createQuery(person).groupBy(person.isCitizen)
.list(Projections.constructor(Alarm.class, person.isCitizen, person.count());

如何避免写那些 n!使用 QueryDSL 的具有 n 个字段的类的构造函数?在删除 Person 类中的构造函数后,我尝试了 Projections.bean,如下所示

personRepo.getQueryDSL().createQuery(person).groupBy(person.isCitizen)
.list(Projections.bean(Alarm.class, person.isCitizen, person.count());

它抱怨 .count() 不是一个有效的表达式。值得注意的是,将 count 的值分配给 person 对象中的 groupByCount 字段。如何使用 Projections.bean 方法设置具有 person.count() 值的 person 对象的 groupByCount ??

提前致谢。非常感谢您的帮助。

【问题讨论】:

    标签: java spring-boot orm jpql querydsl


    【解决方案1】:

    我相信Projections.fields 就是您要找的。让 POJO 中的 setter 名称反映查询中的列名称 - 看起来您已经有了这个。

    【讨论】:

      【解决方案2】:

      我将 .count 顶部的 .as 方法链接到 groupByCount 属性,如下所示。这样我就可以避免写 n!构造函数。

      personRepo.getQueryDSL().createQuery(person).groupBy(person.isCitizen)
      .list(Projections.bean(Alarm.class, person.isCitizen,
      person.count().as(person.groupByCount));
      

      【讨论】:

        猜你喜欢
        • 2018-11-28
        • 1970-01-01
        • 2022-08-08
        • 2018-09-10
        • 2019-03-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-07-08
        相关资源
        最近更新 更多