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.message
是 String
,结果类型是 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();
希望对您有所帮助!
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.message
是 String
,结果类型是 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();
希望对您有所帮助!