我正在使用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}
有解决方案可以解决这个问题吗?
答案 0 :(得分:2)
实际上,经过对Java Bean软件包的深入研究和调试,我发现了正在发生的事情。
链接setter不符合Java Bean规范。出于这个原因,当QueryDsl做一些内省来初始化我的bean时,它会调用一个getWriteMethod
方法,该方法不返回"链接setter" ...
所以我认为有两种选择:
首先:不要将setter链接到Java Bean规范。
第二:使用Projections.bean()
而不是使用QueryDsl Projections.fields()
方法。最后一种方法不会使用setter。因此,根据您的需求,这可能是好的......