2016-08-22 46 views
1

我有兩個實體StudentAppliedCourses在JPA是有可能映射該定製結果加入

@Entity 
public class Student { 
    @Id 
    private Long sid; 
    private String name; 
    private String address; 
    . 
    . 
    . 
    @OneToMany(fetch = FetchType.LAZY) 
    @JoinColumn(name = "sid", referencedColumnName = "sid") 
    private Set<AppliedCourses> appliedCourses; 
} 

@Entity 
public class AppliedCourses { 
    @Id 
    private Long apcid; 
    private Long sid; 
    private String courseName; 
    . 
    . 
    . 
} 

JPQL查詢與應用的課程,以獲取學生的實體是:

select s from Student s left join fetch s.appliedCourses ac where s.id=:sid 

但要求是我只想選擇幾列在學生與應用課程集合沿

即,我想是這樣的:

select new com.foo.StudentStat(s.sid, s.name, s.appliedCourses) 
from Student s left join fetch s.appliedCourses ac where s.sid=:sid 

StudentStat結果類:

@Getter 
@Setter 
@AllArgsConstructor 
public class StudentStat { 
    private Long sid; 
    private String name; 
    private Set<AppliedCourses> appliedCourses; 
} 

上面的查詢會引發以下異常:

Caused by: org.hibernate.QueryException: query specified join fetching, but the owner of the fetched association was not present in the select list 

有沒有其他方法可以達到這個要求?

+0

你不能在構造函數表達式中使用MULTI-VALUED字段 –

+0

有沒有其他的方法可以在jpa中實現呢?或者我應該將它們分成2個查詢? @Neil – harvey123

+0

你可以做一個單一的查詢,返回s.name和ac。*,然後把所有的用戶代碼放在你需要的結構中,或許 –

回答

0

的JPA 2.1規範(JSR 338)不允許引用從產生集合的抓取連接,如果擁有實體本身不是在查詢結果中返回:

JSR 338,節4.4.5.3 :

由FETCH JOIN子句的右側引用必須是關聯或元件的集合,從該被返回作爲查詢的結果的實體或嵌入引用的關聯。不允許爲由FETCH JOIN子句右側引用的對象指定標識變量,因此對隱式提取的實體或元素的引用不能出現在查詢的其他位置。

另一種方法可能是定義一個EntityGraph,但可能不值得。

0
List resultWithAliasedBean = s.createQuery("select s.sid, s.name, s.appliedCourses from Student s left join fetch s.appliedCourses ac where s.sid=:sid").setResultTransformer(Transformers.aliasToBean(StudentStat.class)).list(); 
StudentStat pojo = (StudentStat) resultWithAliasedBean.get(0); 

//如果您使用的標準可以用來轉換結果。

criteria.setResultTransformer(Transformers.aliasToBean(StudentStat.class)); 
+0

s.createQuery()。setResultTransformer是這個hibernate特有的嗎? – harvey123

+0

是它的session.createQuery()。setResultTransformer。在JPA中必須有替代方法來創建JPQL。 – Gokul

+0

重要的是Transformers.aliasToBean(StudentStat.class) – Gokul