Return 来自 EntityManager 的部分实体

Return partial Entity from EntityManager

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

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

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

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() 返回的是未类型化的列表。

如果您只想检索实体的一个基元,getResultList() 将 return 此基元的 List<>。 在你的例子中,如果 s.messageString,结果类型是 List<String>.

然而,我们经常使用不止一种元素。通常,我们为此使用 构造函数表达式 。它们非常强大,因为我们可以将具有连接的查询映射到一个数据对象,或者 - 如您的情况 - select 仅我们真正需要的字段。

假设传输对象是这样的:

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

希望对您有所帮助!