2016-11-15 51 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。所以它可以是好的或不依賴於你的需求...