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

标签 java hibernate jpa projection querydsl

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

相关文章:

java - JAXB 解码到托管 JPA 实体

java - 多列的 PrimeFaces DataExporter 到 XLS 无法正常工作

java - 如何使 EJB 计时器持久化为 false

java - CAS 服务 ACL

java - Spring Boot 2.5.0、Spring Cloud 2020.0.2 和 Hibernate 5.4.31 - H2 数据库多行插入失败

java - 使用多个注入(inject) DAO 时的最佳实践是什么

java - Jpa 删除具有替代多对一关系的可选父级

java - 如何创建同步数组列表

java - JPA将两个或多个表合并到另一个表中

java - 如何使用唯一列更新行