gpt4 book ai didi

java - Hibernate 忽略带有投影 beans 的链式 setter

转载 作者:行者123 更新时间:2023-11-30 02:44:28 25 4
gpt4 key购买 nike

我正在使用 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com