如何使用JPA的nativeQuery将查询出的信息封装为对象
2017-07-06 12:30
1681 查看
在实际的项目中,很多时候需要很复杂的查询,而JPQL有些功能是不支持的,Criteria的写法又过于复杂了。
用原生sql的方式进行查询会省很多事(缺点是和具体使用的数据库高度耦合了),但是使用JPA的createnativeQuery查询出来的却是一个Object对象,需要我们自己做一些封装的操作。
如果是查询ResultList,则循环封装
这样的做法很麻烦,而且容易出错。其实JPA已经提供了对应的参数封装方法。
语法如下
完整的Demo
要注意:sql中的查询字段要和DO类中的属性相对应,如果有别名,那么别名要和属性对应
原生SQL不支持SetParameter方法,不能使用?0,:param等占位符,否则会报一个奇葩的错。
类中的属性仅支持基本类型、包装类型和String类型。枚举、其它类都是不支持的。(关于这点可以使用取巧用Set方法做转换。例子如下:)
用原生sql的方式进行查询会省很多事(缺点是和具体使用的数据库高度耦合了),但是使用JPA的createnativeQuery查询出来的却是一个Object对象,需要我们自己做一些封装的操作。
//查询语句,本地sql String sql = "SELECT telephone, password FROM user where id = 1"; //查询 Object result = ssoEntityManager.createNativeQuery(sql) .getSingleResult(); //将对象转换为数据 Object[] params = (Object[]) result; //分别封装各个参数 UserDO userDO = new UserDO(); userDO.setTelephone(params[0].toString()); userDO.setPassword(params[1].toString());
如果是查询ResultList,则循环封装
这样的做法很麻烦,而且容易出错。其实JPA已经提供了对应的参数封装方法。
语法如下
query.unwrap(SQLQuery.class) .setResultTransformer( Transformers.aliasToBean(要转换的类) ) .list();//根据实际情况调用不同的方法,list--》获取一个集合
完整的Demo
public class UserDO { public UserDO () {} private String telephone; private String password; //Setter,Getter }
String sql = "SELECT telephone, password FROM user"; Query query = ssoEntityManager.createNativeQuery(sql); List<UserDO> list = query.unwrap(SQLQuery.class) .setResultTransformer(Transformers.aliasToBean(UserDO.class)) .list();
要注意:sql中的查询字段要和DO类中的属性相对应,如果有别名,那么别名要和属性对应
原生SQL不支持SetParameter方法,不能使用?0,:param等占位符,否则会报一个奇葩的错。
类中的属性仅支持基本类型、包装类型和String类型。枚举、其它类都是不支持的。(关于这点可以使用取巧用Set方法做转换。例子如下:)
class User{ private Gender sex;//性别的枚举, public void setSex(String sex) { this.sex = Gender.valueOf(sex); } }
相关文章推荐
- 求助,如何使用批处理命令查询本机有几个盘,然后每个盘总大小空间和可用大小空间,然后将这些信息生成一个文档,求高手指教,谢谢。
- 关于Spring data JPA 如何使用条件查询。
- 使用SAX读取XML文件--(将信息封装到对象)
- hibernate 使用sql 查询利用setResultTransformer查询出封装好的VO对象
- 如何使用beanUtils对象的方法来封装实体对象属性?
- JSP 如何使用对象收集form表单的信息
- springboot使用JPA时间类型如何模糊查询
- 调用play的jpa查询数据时添加Transformers.ALIAS_TO_ENTITY_MAP可将结果集封装到list<map>对象里
- 使用jpa hql语句查询关联多个表 如何用struts的iterator接受显示数据
- 如何封装查询记录到Java对象数组
- 使用dbUtil多表查询获取的数据涉及多个对象时的封装
- Hibernate JPA 如何使用SQL文直接查询
- 指针的使用和练习 I - 如何通过指针访问的使用对象里的private信息
- 创建智能网络蜘蛛——如何使用Java网络对象和HTML对象(翻译)
- 如何使用lucene.net,建立索引,索引目录,查询返回结果
- 根据系统表查询用户方案下所有对象信息的用例语句
- 如何在查看PDF文档时使用金山词霸自动取词查询功能
- 如何在C# 中使用WMI 实现远程查询和共享
- 使用APPlication,Session,Cookie和ViewState等对象保存信息的区别是什么?
- Web设计中如何使用XML数据源对象