博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
所有查询的结果自动封装成map返回
阅读量:4196 次
发布时间:2019-05-26

本文共 1935 字,大约阅读时间需要 6 分钟。

JPA的出现, 统一了逐渐混乱起来的Java ORM产品, 这无疑是件好事情, 包括toplink, hibernate, kodo,openJPA 等几种ORM实现现在都已经兼容支持JPA了.

Hibernate作为一个广为人知的ORM/JPA实现, 是我比较喜欢并熟悉的一个, 因此把Glassfish默认的Toplink替换成了Hibernate.  JPA的persistence操作是通过EntityManager来实现的, 在大部分时候使用JPA的接口就可以完成大多数的数据库操作了, 但是对于一些复杂的情况, JPA的接口毕竟只是Hibernate的一个子集, 使得我必须去使用Hibernate来完成.

比如Hibernate实现里有许多针对查询的优化, 我想把所有查询的结果自动封装成map返回可以使用Hibernate的 session.createSQLQuery(sql) .setResultTransformer(Criteria.ALIAS_TO_ENTITY_MAP).list(); 以达到简化不同层之间对象传递的目的. 但是在JPA的标准接口里, 并不提供这样的服务, 所以这种情况下必须转而调用Hibernate来进行.

原理是通过entitymanager的实例来得到Hibernate session的实例, 这样就可以进而调用所有hibernate提供的服务了.   具体做法是

.....JPA.....

Session session = (Session) entityManager.getDelegate();   //get  an instance of hibernate session

....Hibernate.....

list = session

     .createSQLQuery("select code, name from org_employee")
     .setResultTransformer(Criteria.ALIAS_TO_ENTITY_MAP).list();

上端代码在JUnit下测试通过, 需要注意的是在ejb容器里测试的时候抛出了一个classcast例外, 经过debug得知,在容器模式下, entitymaager返回的delegate是不同的, 因此,需要区分具体情况.

完整的实现如下:

List list = null;

  try {
   EntityManager entityManager = beginTransaction();
   String ql = filter.generateSearchQuery();
   // Query query = entityManager.createQuery(ql);
   Session session = null;

   if (!this.isManaged()) {

    session = (Session) entityManager.getDelegate();

   } else {

    EntityManagerImpl hibernateImpl = (EntityManagerImpl) entityManager
      .getDelegate();
    session = hibernateImpl.getSession();
   }

   list = session

     .createSQLQuery("select code, name from org_employee")
     .setResultTransformer(Criteria.ALIAS_TO_ENTITY_MAP).list();
   // PageInfo pageInfo = filter.getPageInfo();
   // if(pageInfo != null){
   // query.setFirstResult(pageInfo.getFirstResultIndex());
   // query.setMaxResults(pageInfo.getPageSize());
   // }
   // list = query.getResultList();
   commit();
  } catch (Exception e) {
   rollback();
   throw new ServiceException(e);
  }
  return list;

以上代码在容器模式和pojo模式下同时测试通过.

同样的道理, 如果你用的不是Hibernate, 用的是其他的JPA实现, 同样可以通过相同的方法达到在JPA里调用implementation particular的服务的目的.

转载地址:http://hgzli.baihongyu.com/

你可能感兴趣的文章
(二)Git--工作区和暂存区、管理修改与撤销
查看>>
(七)Git--自定义Git
查看>>
(五)Git--分支管理
查看>>
(四)Git--远程仓库
查看>>
(六) Git--标签管理
查看>>
java中继承,子类是否继承父类的构造函数
查看>>
什么是Spring Cloud ?
查看>>
pyqt实现界面化编程
查看>>
qt写DLL文件并调用和出现的问题分析
查看>>
工厂模式(Factory)-设计模式(一)
查看>>
建造者模式(Builder)-设计模式(三)
查看>>
初学Java必备基础知识,编程领域你需要掌握的关键点!
查看>>
阿里五年Java程序员的总结,献给还在迷茫中的你!
查看>>
程序员身上有异味,同事为什么都不会直接告诉他?
查看>>
Java、C、C+ +、PHP、Python分别用来开发什么?一篇文章告诉你!
查看>>
Linux-SHELL常用命令
查看>>
Linux-网络运维基础
查看>>
Verilog编程网站学习——门电路、组合电路、时序电路
查看>>
android——学生信息显示和添加
查看>>
Android——ImageSwitcher轮流显示动画
查看>>