2016-12-21 8 views
0

JPA-QL заявляет, что я должен иметь возможность запросить объект с select 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

Если вы хотите получить только один примитив объекта, getResultList() вернет список <> этого примитива. В вашем случае, если s.message - String, то результат будет List<String>.

Однако мы часто используем не только один элемент. Обычно для этого используются выражения конструктора . Они очень мощные, потому что мы можем сопоставлять запросы с объединениями к одному объекту данных или - как в вашем случае - выбирать только те поля, которые мы действительно хотим.

Предположим Transfer Object, как это:

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. –