从EntityManager

时间:2016-12-21 20:53:57

标签: java hibernate jpa jersey entitymanager

JPA-QL声明我应该能够使用select s.message from Status s查询实体,该实体在JPA-QL控制台中有效。

但是,我真正想做的只是在返回列表中返回实体的特定属性,如下所示:

@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;
}

2 个答案:

答案 0 :(得分:1)

如果您只想检索实体的一个原语,getResultList()将返回一个List&lt;&gt;这个原始的。 在您的情况下,如果s.messageString,则结果类型为List<String>

但是,我们经常使用的不仅仅是一个元素。通常,我们使用构造函数表达式。它们非常强大,因为我们可以将带有连接的查询映射到一个数据对象,或者 - 在您的情况下 - 只选择我们真正想要的字段。

假设传输对象如下:

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();

希望这有帮助!

答案 1 :(得分: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()获得的是无类型列表。