與HQL

2016-09-14 26 views
3
選擇收藏

我有以下類別:與HQL

Person.java

class Person { 
    String name; 
    Set<Hotel> visitedHotels; 
    String someOtherData; 

    public Person() {} 

    public Person(String name, Set<Hotel> visitedHotels) { 
     this.name; 
     this.visitedHotels = this.visitedHotels; 
    } 

    // getters & setters 
} 

Hotel.java

class Hotel { 
    // some code 
} 

出於安全原因 「someOtherData」 應該有時不被加載。

所以,我想下面的HQL:

select new Person(p.name , elements(p.visitedHotels)) from Person p 

select new Person(p.name , hotels) from Person p left join p.visitedHotels hotels 

但它不工作 - 錯誤:無法找到的類Person合適的構造函數。

是否有可能與人名一起選擇酒店集合?

+1

JPQL BNF禁止在SELECT子句中使用多值字段,請參閱JPA規範 –

回答

0

使用集合映射查看Blaze-Persistence實體視圖。這可能只是你在找什麼:https://persistence.blazebit.com/documentation/entity-view/manual/en_US/index.html#collection-mappings

允許有一個單獨的DTO像

@EntityView(Person.class) 
interfae PersonView { 
    String getName(); 
    Set<Hotel> getVisitedHotels(); 
} 

Usage in the query like 

CriteriaBuilder<PersonView> cb = entityViewManager.apply(
    EntityViewSetting.create(PersonView.class), 
    criteriaBuilderFactory.create(Person.class) 
); 

List<PersonView> list = cb.getResultList(); 

創建像

SELECT person.name, visitedHotels_1 FROM Person person LEFT JOIN person.visitedHotels visitedHotels_1 

查詢既然你似乎可以用這個可視化,我建議將酒店映射爲實體視圖。