我正在使用 QueryDsl/JPA/Hibernate 进行简单的查询,可以这样写:
从用户 u 中选择 u.id、u.name,其中 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(我在 Debug模式下看到它。),因此我的 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}
有办法解决这个问题吗?
最佳答案
实际上,在深入研究和调试 Java Bean 包之后,我弄清楚了发生了什么。
链接 setter 不符合 Java Bean 规范。因此,当 QueryDsl 进行一些内省(introspection)来初始化我的 bean 时,它会调用一个不返回“链接 setter ”的 getWriteMethod
方法...
所以我认为有两种选择:
第一:不要链接 setter 以尊重 Java Bean 规范。
第二:不要使用 QueryDsl Projections.bean()
方法,而是使用 Projections.fields()
。最后一个方法不会使用 setter。所以它可以是好是坏取决于您的需要......
关于java - Hibernate 忽略带有投影 beans 的链式 setter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40612515/