Querydsl Projection.bean找不到设置器

时间:2018-06-19 15:15:46

标签: hibernate spring-mvc querydsl

假设City和CityDTO为

@Entity
public class City {
    private Long id;
    private String name;
    @Column(name="id")
    public Long getId(){ 
        return this.id;
    }
    public City setId(Long id) {
        this.id = id;
        return this;
    }
    @Column(name="name")
    public String getName(){ 
        return this.name;
    }
    public City setName(String name) {
        this.name = name;
        return this;
    }
    @Transient
    public String anotherInformationToSerializeInJsonButNotPersist() {
        return "this is an example of some functions that we have inside entities";
}

public class CityDTO {
    private Long id;
    private String name;
    private String anotherMuchRelevantInformationDifferentFromEntityTransientOne;
    public Long getId(){ 
        return this.id;
    }
    public CityDTO setId(Long id) {
        this.id = id;
        return this;
    }
    public String getName(){ 
        return this.name;
    }
    public CityDTO setName(String id) {
        this.name = name;
        return this;
    }
    public String getAnotherMuchRelevantInformationDifferentFromEntityTransientOne(){ 
        return this.anotherMuchRelevantInformationDifferentFromEntityTransientOne;
    }
    public CityDTO setAnotherMuchRelevantInformationDifferentFromEntityTransientOne(String anotherMuchRelevantInformationDifferentFromEntityTransientOne) {
        this.anotherMuchRelevantInformationDifferentFromEntityTransientOne = anotherMuchRelevantInformationDifferentFromEntityTransientOne;
        return this;
    }
}

当用Projection.fields查询时,一切都很好,返回的QBean的字段列表的大小符合预期(2),元素的字段引用与预期的一样(最后我认为这是预期的,例如id字段名称为“ id”,类型为Long,修饰符为2,但fieldAccessor为null),并且使用fetch生成的DTO列表正确填充了ID和名称。

但是,我想使用setter而不是字段,因此我尝试使用Projections.bean。使用这种方法,QBean返回了一个空字段列表和一个大小相同的列表设置器,但所有元素均为null,由fetch生成的DTO列表带有id和name(显然)为null。

两个投影都生成一个大小为2的绑定图,例如{“ id”->“ city.id”,“ name”->“ city.name”;

无法找出问题所在。 fieldAccessor是否用于定义setter,并且由于它为空,所以projection无法定义它们?

我最近使用的是Spring Framework 4,查询是这样的:

...
QCity qCity = QCity.city;
return new JPAQueryFactory(sessionFactory.getCurrentSession())
    .select(Projections.bean(CityDTO.class, qCity.id, qCity.name)
    .from(qCity)
    .fetch();

有什么想法吗?

编辑:

实际上,甚至为City.class的结果进行投影都是一样的...无法使用设置器绑定查询中的值...

1 个答案:

答案 0 :(得分:1)

罗伯特·贝恩(Robert Bain)评论要求显示getter和setter之后,我意识到我们使用了流利的setter模式,因此我对其进行了更改,并再次成功地用Projections.bean测试查询...

如果其他人陷入同样的​​情况,我会注册一个答案,并向querydsl发出一个问题,以查看是否支持在API上使用fluet setter。