最近一直在用JPA,使用了EntityManager作为基本查询方法。EntityManager可以满足基本的增删改查,但实际上很多时候,是必须采用原生查询的。而且,原生查询的返回值必须和自定义实体相配。

当自定义实体对应原生查询的返回值的时候,一般有2种方法。

1)自定义实体类,可以直接运用createNativeQuery的方法。

接口定义如下:

public Query createNativeQuery(String sqlString, Class resultClass)

class的定义,应该使用@Entity定义,并写到JPA配置文件里。

如定义类A,定义如下:

@Entity
public class A {
    @Id
    private String id;  //必须设置主键,实体才能正确

    public String getId() {
        return idarea;
    }

    public void setId(String id) {
        this.id = id;
    }
}

JPA配置文件如下,如META-INF/persistence.xml里定义如下:

<class>hello.world.A</class>

然后,执行CreateNativeQuery,即可调用如下方法:

String sql = "需要的语句";
List lst = em.createNativeQuery(sql, A.class).getResultList();

2)使用unwrap和Transformers方法,方法如下:

(1)A正常定义;(无需加@Entity和@Id,无需persistence.xml生成)

(2)执行类似如下语句:

 String sql = "需要的语句";

 NativeQueryImpl query = em.createNativeQuery(sql).unwrap(NativeQueryImpl.class);
 query.setResultTransformer(Transformers.aliasToBean(A.class));

 List lst = query.getResultList();

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐