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

+0

당신은 이것 좀 봐 : http://stackoverflow.com/a/6532840/1266906 – TheConstructor

+0

다른 종류의 상속 전략을 사용하여 그런 종류의 결과를 얻을 수 있습니까? – Bartek

답변

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 ** 이후 항상 사용되며 항상 수퍼 클래스를 하위에 캐스팅하는 것으로 보입니다. 두 번째 제안에 대해서는 HyperJaxb에서 Question와 DetailedQuestion을 모두 생성하므로 생성자를 추가 할 수 없습니다. 아니면 Jaxb가 생성자를 생성하는 방법이 있을까요? 또는 JPA 쿼리에서 setter를 사용 하시겠습니까? – Bartek

+0

그런 다음 임의의 POJO를 만듭니다. 그리고 나는 Hyperjaxb를 모른다. – NoDataFound

+0

TREAT는 JPA 상속과 함께 사용되며 질문이 엔티티가 아니기 때문에 여기에 해당되지 않습니다. Treat는 조인을 필요로하지 않지만, Treat를 사용할 필요가없는 관계가 아니라면 AnsweredQuestion 대신 Question에서 선택하면됩니다. – Chris

관련 문제