【问题标题】:Return partial Entity from EntityManager从 EntityManager 返回部分实体
【发布时间】:2017-05-07 09:44:01
【问题描述】:

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

【问题讨论】:

标签: java hibernate jpa jersey entitymanager


【解决方案1】:

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

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

假设像这样的传输对象:

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 用于使用构造函数表达式来避免结果集中的基元流。当您要获取的字段子集是不同类型(如 long 和 String)时,这特别有用。
【解决方案2】:

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

您正在查询状态消息,但将其键入List&lt;Status&gt;。 我认为应该是:

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

因为您期望从 getResultList() 得到的是无类型列表。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-03-30
    • 1970-01-01
    • 1970-01-01
    • 2013-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多