Hibernate忽略带有投影bean的链式setter

时间:2016-11-15 14:35:26

标签: java hibernate jpa projection querydsl

我正在使用QueryDsl / JPA / Hibernate进行简单查询,可以这样编写:

SELECT u.id, u.name FROM user u WHERE u.id = 1;

我因为性能问题而使用投影bean ...

使用QueryDsl,查询如下所示:

query.from(qUser).where(qUser.id.eq(1)).singleResult(
    Projections.bean(User.class,
        qUser.id,
        qUser.name
    )
);

我的问题出在我的User实体中。我想链接我的setter所以所有setter都返回this。当我使用投影bean Hibernate执行此操作时,不要调用setter(我在调试模式下看到它。)因此我的User实体未初始化。

例如,使用此User实体声明:

@Entity(name = "USER")
public class User {

    @Column(name = "ID")
    private Long id;

    @Column(name = "NAME")
    private String name;

    public void setId(Long id) { //Setter called
        this.id = id;
    }

    public User setName(String name) { //Setter not called
        this.name = name;
        return this;
    }
}

我的查询返回的用户名为null

User: {id: 1, name: null}

有解决方案可以解决这个问题吗?

1 个答案:

答案 0 :(得分:2)

实际上,经过对Java Bean软件包的深入研究和调试,我发现了正在发生的事情。

链接setter不符合Java Bean规范。出于这个原因,当QueryDsl做一些内省来初始化我的bean时,它会调用一个getWriteMethod方法,该方法不返回"链接setter" ...

所以我认为有两种选择:

首先:不要将setter链接到Java Bean规范。

第二:使用Projections.bean()而不是使用QueryDsl Projections.fields()方法。最后一种方法不会使用setter。因此,根据您的需求,这可能是好的......