首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JPA本机查询选择和强制转换对象

JPA本机查询选择和强制转换对象
EN

Stack Overflow用户
提问于 2013-07-18 03:50:02
回答 3查看 172.7K关注 0票数 31

我有一个扩展User的对象Admin。默认情况下,这两个对象都在我的Derby数据库(Admin中包含的字段)的User_表中。通常我会像这样选择一个User

代码语言:javascript
复制
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();

但是,由于查询的复杂性,我使用的原生查询如下:

代码语言:javascript
复制
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 (等等)相同的值)?

EN

回答 3

Stack Overflow用户

发布于 2018-12-22 03:05:02

接受的答案是不正确的。

createNativeQuery将始终返回Query

代码语言:javascript
复制
public Query createNativeQuery(String sqlString, Class resultClass);

Query上调用getResultList将返回List

代码语言:javascript
复制
List getResultList()

List<MyEntity>赋值(或强制转换)时,会生成未选中的赋值警告。

然而,createQuery将返回一个TypedQuery

代码语言:javascript
复制
public <T> TypedQuery<T> createQuery(String qlString, Class<T> resultClass);

TypedQuery上调用getResultList将返回List<X>

代码语言:javascript
复制
List<X> getResultList();

这是正确键入的,不会给出警告。

对于createNativeQuery,使用ObjectMapper似乎是摆脱警告的唯一方法。就我个人而言,我选择抑制警告,因为我认为这是库中的一个缺陷,不是我应该担心的事情。

票数 9
EN

Stack Overflow用户

发布于 2019-04-14 01:30:24

当您的原生查询基于连接时,在这种情况下,您可以获得对象列表形式的结果并对其进行处理。

一个简单的例子。

代码语言:javascript
复制
@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 
     }
票数 5
EN

Stack Overflow用户

发布于 2017-11-11 13:35:00

请参考JPA : How to convert a native query result set to POJO class collection

对于Postgres 9.4

代码语言:javascript
复制
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);
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17708946

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档