Hibernate 忽略链式 setter 与投影 bean
Hibernate ignore chained setter with projections beans
我正在使用 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 所以所有 setters return this
。当我使用投影 bean Hibernate 执行此操作时,不要调用 setters(我在调试模式下看到它。)所以我的 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;
}
}
我有一个用户 return 通过我的查询搜索 null
姓名:
User: {id: 1, name: null}
有没有办法解决这个问题?
实际上,在深入研究和调试 Java Bean 包之后,我明白了发生了什么。
链接 setter 不符合 Java Bean 规范。出于这个原因,当 QueryDsl 做一些内省来初始化我的 bean 时,它调用一个 getWriteMethod
方法,该方法不 return "chaining setters"...
所以我认为有两个选择:
首先: 不要链接 setter 以遵守 Java Bean 规范。
其次: 不使用 QueryDsl Projections.bean()
方法,而是使用 Projections.fields()
。最后一种方法不会使用 setters。所以它可以是好是坏取决于你的需要...
我正在使用 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 所以所有 setters return this
。当我使用投影 bean Hibernate 执行此操作时,不要调用 setters(我在调试模式下看到它。)所以我的 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;
}
}
我有一个用户 return 通过我的查询搜索 null
姓名:
User: {id: 1, name: null}
有没有办法解决这个问题?
实际上,在深入研究和调试 Java Bean 包之后,我明白了发生了什么。
链接 setter 不符合 Java Bean 规范。出于这个原因,当 QueryDsl 做一些内省来初始化我的 bean 时,它调用一个 getWriteMethod
方法,该方法不 return "chaining setters"...
所以我认为有两个选择:
首先: 不要链接 setter 以遵守 Java Bean 规范。
其次: 不使用 QueryDsl Projections.bean()
方法,而是使用 Projections.fields()
。最后一种方法不会使用 setters。所以它可以是好是坏取决于你的需要...