2016-12-21 12 views
0

JPA-QLselect s.message from Status sでエンティティにクエリを実行できるはずですが、これはJPA-QLコンソールで機能します。まったく本当のエラーメッセージが表示されて、しかしEntityManagerから部分的なエンティティを返します

@GET 
@Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON }) 
public List<Status> getIt() { 
    EntityManager em = PersistenceManager.INSTANCE.getEntityManager(); 
    List<Status> results = em.createQuery("select s.message from Status s").getResultList(); 

    return results; 
} 

そのエラーが出て、:

しかし、私が本当にしたいことはそうのように、リターンリストにエンティティの特定のプロパティのみを返しています。 私はHibernateはこのクエリを実行したことがわかります。

Hibernate: 
    select 
     status0_.ID as col_0_0_ 
    from 
     LIBRARY.TABLE status0_ 

うまく伝統的なselect s from Status s作品:

@GET 
@Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON }) 
public List<Status> getIt() { 
    EntityManager em = PersistenceManager.INSTANCE.getEntityManager(); 
    List<Status> results = em.createQuery("select s from Status s").getResultList(); 

    return results; 
} 
+0

[JPA 2.0:エンティティのフィールドのサブセットをロードする]の可能な複製(http://stackoverflow.com/questions/6526048/jpa-2-0-load-a-subset-of-fields-for- an-entity) –

答えて

0

List<Status> results = em.createQuery("select s.message from Status s").getResultList();

をあなたは、ステータスのメッセージを照会するが、List<Status>にそれを入力しています。 私はそれがあるべきと考えている:

List results = em.createQuery("select s.message from Status s").getResultList();

あなたが戻ってgetResultList(から得ることを期待するものなので)は型なしのリストです。

1

エンティティのプリミティブを1つだけ取り出す場合は、getResultList()がこのプリミティブのリスト<を返します。 s.messageStringの場合、結果のタイプはList<String>です。

しかし、多くの場合、1つ以上の要素を使用します。通常は、のコンストラクタ式を使用します。ジョインを使ってクエリーを1つのデータオブジェクトにマップすることができます。または、あなたの場合のように、私たちが本当に必要とするフィールドだけを選択することができます。

は、このような転送オブジェクトを想定します

public class TO { 
    Long id; 
    String message; 
    public TO(Long id, String message) { 
     this.id = id; 
     this.message = message; 
} 

その後、あなたは(私はTypedQueriesを好む)クエリを作成することができます

TypedQuery<TO> qry = em.createQuery("SELECT NEW org.mypackage.TO(s.id, s.message) FROM Status s", TO.class); 
List<TO> myList = qry.getResultList(); 

・ホープ、このことができます!

+0

結果セットのプリミティブのストリームを避けるためにコンストラクタ式を使用する場合は+1します。これは、フェッチするフィールドのサブセットがlongやStringのような異なる型である場合に特に便利です。 –

関連する問題