最近一直在用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();