2016-11-15 4 views
1

я делаю простой запрос с QueryDsl/JPA/Hibernate, которые можно записать так:Hibernate игнорировать цепочечные сеттер с проекциями фасолью

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. Когда я делаю это с проекционным компонентом Hibernate, не вызывайте сеттеры (я видел его в режиме отладки.), Поэтому мой объект User не инициализирован.

Для Exemple с этой декларацией 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} 

есть решение, чтобы решить эту проблему?

ответ

2

На самом деле после некоторого исследования и отладки внутри пакетов Java Bean я понял, что происходит.

Цепочный сеттер не соответствует спецификации Java Bean. По этой причине, когда QueryDsl сделать некоторые самоанализа, чтобы инициализировать мой боб, это вызвать getWriteMethod метод, который не возвращать «СЦЕПЛЕНИЕ сеттеры» ...

Так что я думаю, что есть два варианта:

Первое: Do а не цепной сеттер, чтобы соблюдать спецификации Java Bean.

Второй: Вместо использования QueryDsl Projections.bean() способ использование Projections.fields(). Этот последний метод не будет использовать сеттеры. Так что это может быть хорошо или не зависит от ваших потребностей ...