我有一个扩展User的对象Admin。默认情况下,这两个对象都在我的Derby数据库(Admin中包含的字段)的User_表中。通常我会像这样选择一个User:
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<User> query = cb.createQuery(User.class);
Root user= query.from(User.class);
Predicate predicateId = cb.equal(category.get("id"), id);
query.select(user).where(predicateId);
return em.createQuery(query).getSingleResult();但是,由于查询的复杂性,我使用的原生查询如下:
Query query = em.createNativeQuery("SELECT USER.* FROM USER_ AS USER WHERE ID = ?");
query.setParameter(1, id);
return (User) query.getSingleResult();尽管这抛出了一个强制转换异常。我认为这是由于Admin中的任何字段造成的。
我的问题是,如何使用原生查询选择一个与第一个示例结果相等的User (包括与JPQL查询返回的@LOB和@ManyToOne (等等)相同的值)?
发布于 2018-12-22 03:05:02
接受的答案是不正确的。
createNativeQuery将始终返回Query
public Query createNativeQuery(String sqlString, Class resultClass);在Query上调用getResultList将返回List
List getResultList()向List<MyEntity>赋值(或强制转换)时,会生成未选中的赋值警告。
然而,createQuery将返回一个TypedQuery
public <T> TypedQuery<T> createQuery(String qlString, Class<T> resultClass);在TypedQuery上调用getResultList将返回List<X>。
List<X> getResultList();这是正确键入的,不会给出警告。
对于createNativeQuery,使用ObjectMapper似乎是摆脱警告的唯一方法。就我个人而言,我选择抑制警告,因为我认为这是库中的一个缺陷,不是我应该担心的事情。
发布于 2019-04-14 01:30:24
当您的原生查询基于连接时,在这种情况下,您可以获得对象列表形式的结果并对其进行处理。
一个简单的例子。
@Autowired
EntityManager em;
String nativeQuery = "select name,age from users where id=?";
Query query = em.createNativeQuery(nativeQuery);
query.setParameter(1,id);
List<Object[]> list = query.getResultList();
for(Object[] q1 : list){
String name = q1[0].toString();
//..
//do something more on
}发布于 2017-11-11 13:35:00
请参考JPA : How to convert a native query result set to POJO class collection
对于Postgres 9.4,
List<String> list = em.createNativeQuery("select cast(row_to_json(u) as text) from myschema.USER_ u WHERE ID = ?")
.setParameter(1, id).getResultList();
User map = new ObjectMapper().readValue(list.get(0), User.class);https://stackoverflow.com/questions/17708946
复制相似问题