2016-11-15 49 views
1

我做一个简单的查询与QueryDsl/JPA /休眠,可以这样写:休眠忽略链接的制定者有凸起豆

SELECT u.id, u.name FROM user u WHERE u.id = 1;

我使用的,因为性能问题的预测豆...

随着QueryDsl查询这个样子的:

query.from(qUser).where(qUser.id.eq(1)).singleResult(
    Projections.bean(User.class, 
     qUser.id, 
     qUser.name 
    ) 
); 

我的问题是在我的User实体。我想链接我的二传手,让所有安装者返回this。当我用投影bean Hibernate做这些时,不要调用setter(我在调试模式下看到它),所以我的User实体没有被初始化。

对于为例这种User实体声明:

User: {id: 1, name: null} 

是否有解决这个问题的解决方案:

@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名回到我的查询?

回答

2

实际上,在深入研究和调试Java Bean软件包之后,我想清楚发生了什么。

链接setter不符合Java Bean规范。出于这个原因,当QueryDsl做一些反省初始化我的豆,它调用一个方法getWriteMethod不返回“链接二传手” ......

所以我觉得有两种选择:

第一:待办事项而不是链式设置器来尊重Java Bean规范。

第二个:而不是使用QueryDsl Projections.bean()方法使用Projections.fields()。这最后一个方法不会使用setters。所以它可以是好的或不依赖于你的需求...