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())

我在我的项目中使用 QueryDSL 来 return 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 个字段的 class 的构造函数 ??在删除 Person class

中的构造函数后,我尝试了如下所示的 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 ??

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

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

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

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