2014-10-05 118 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

相关问题