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。所以它可以是好是坏取决于你的需要...