jpasql查询语句
Ⅰ JPA使用原生sql结果集转换成Map
知烂 JPA中使用原生sql查询出的结果中每一条记录是object数组,如下所示
String sql = "select id,group_name from form_temp_type";
Query query = entityManager.createNativeQuery(sql);
List<Object[]> list = query.getResultList();//最终的结果集是object数组
我们在使用的时候需要从数组中逐个取出,比较麻烦。很多情况下我们需要的是对象或者Map.
String sql = "select id,group_name from form_temp_type";
Query query = entityManager.createNativeQuery(sql);
query.unwrap(SQLQuery.class).setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP);
List<Map> list = query.getResultList();//这里的结果是Map,我们可以通过字段名称获取到相应的值
public static List findRelatives(Stringsql,Map<String,Object>params,EntityManagerentityManager,Class<?>clazz){
Sessionsession=entityManager.unwrap(Session.class);
NativeQueryquery=session.createNativeQuery(sql);
query.unwrap(NativeQueryImpl.class).setResultTransformer(Transformers.aliasToBean(clazz));
烂穗 for(Stringkey:params.keySet()){
Objectvalue=params.get(key);
饥猛卜query.setParameter(key,value);
}
entityManager.close();
returnquery.getResultList();
}
Ⅱ 原生sql查询怎样返回page对象
最近由于需求变更,客户需要在原来的查询基础上加上一个判断条件,但是这个判断条件所在的实体跟原来的查询实体没有直接关联。为了不影响原来的查询结果,改为用原生SQL,使用left join来关联查询。为了不改变对查询结果的处理逻辑,将查询结果封装成原来的对象进行操作。具体操作方法如下:
1.基于JPA规范的程序:
Query query = entityManager.createNativeQuery("select id, name, age from t_user");
query.unwrap(SQLQuery.class).setResultTransformer(Transformers.aliasToBean(clazz));
// 其中clazz为封装对象的class
List rows = query.getResultList();
2.基于Session的程序:
sess.createSQLQuery("SELECT NAME, BIRTHDATE FROM CATS").setResultTransformer(Transformers.aliasToBean(clazz));
这两种方法需要注意的是查询的字段的别名需要跟clazz的属性对应。
Ⅲ jpa 中的自定义sql语句 distinct能用吗
首先要解释的是:Distinct是避免 查询里的重复行,不是针对某一列的。
简单举例,数据表这样写:
姓名 年龄 性别
----------------------
张三 男 25
李四 女 25
王五 男 42
那么我这么写:
select distinct * from 表名
毫无效果,因为压根就没重复行,如果把语句减少一个查询字段:
select distinct 年龄 from 表名
那结果就只有两条了