2014-10-05 92 views
0

關於下面的例子,是否有可能檢索AnsweredQuestion實例列表作爲的對象問題JPA - 是否可以獲得結果作爲@MappedSuperclass的實例?

@MappedSuperclass 
public abstract class Question{ 
    @Column(name="TITLE") 
    private String title; 
    ... 
} 

@Entity 
@Table(name="ANSWEREDQUESTION") 
public class AnsweredQuestion extends Question 
{ 
    @Column(name="ANSWER") 
    private String answer; 
    ... 
} 

對於我來說,檢索只有少數列是非常重要的,因爲後裔類有很多。 我試過的東西如下,但它仍然會返回AnsweredQuestion的名單:

queryStr = " select q from AnsweredQuestion q where ..." 
TypedQuery<Question> query = entityManager.createQuery(queryStr, Question.class); 
return query.setParameter(...).getResultList(); 
+1

否:1.無法實例化抽象類2.您從「AnsweredQuestion」中選擇 - 所以你得到他們 – TheConstructor 2014-10-05 19:22:24

+0

你也可以看看這個:http://stackoverflow.com/a/6532840/1266906 – TheConstructor 2014-10-05 19:26:16

+0

是否有可能使用某種其他類型的繼承策略獲得這種結果? – Bartek 2014-10-05 20:49:52

回答

2

如果您需要返回幾個字段,您也可以選擇它們,然後使用new操作:

TypedQuery<Sample> query = entityManager.createQuery("select new com.acme.sample.Sample(e.fieldA, e.fieldB) from AnsweredQuestion e", Sample.class); 
return query.setParameter(...).getResultList(); 

JPA實現將查找Sample構造函數(路徑必須完整)並在轉換結果時調用它。它非常方便(以創建新類來表示結果爲代價),以避免返回數據庫必須返回的所有內容:)

+0

恐怕TREAT不適用於這個問題。我嘗試了你建議的語法,並得到org.hibernate.hql.internal.ast.QuerySyntaxException:意外的令牌:treat(...)。在互聯網上我找不到任何「select ** TREAT **」的例子,但它似乎總是在** JOIN **之後使用,並且始終將超類投射給孩子。關於第二個建議,Question和DetailedQuestion都是由HyperJaxb生成的,所以我不能向它們添加構造函數。或者也許有一種方法可以讓Jaxb生成一個構造函數?或者在JPA查詢中使用setter? – Bartek 2014-10-05 20:35:54

+0

然後創建一些隨機POJO。我不知道Hyperjaxb。 – NoDataFound 2014-10-05 20:50:05

+0

TREAT與JPA繼承一起使用,因此問題不是實體。 Treat不需要連接,但如果它不在關係中,則不需要使用Treat,您只需從Question中選擇而不是AnsweredQuestion。 – Chris 2014-10-06 00:31:13

相關問題