Hibernate将HQL语句转换成SQL语句

来源:互联网 发布:淘宝差评如何巧妙回复 编辑:程序博客网 时间:2024/06/11 03:37
Hibernate已经是不单单是ORM框架了,从Hibernate的社区就能看到其发展前景了。其在Java开发中很是常见.
其特有的HQL语句还是Java开发者必备技能。但是有时间HQL不是很好用或者不确定其转换后的SQL语句形式。亦或
只是为了偷懒,比如利用一条语句完成结果集检索和数量统计。需要将HQL语句转换成SQL语句!

Hibernate本身就提供了其实现类,只是知道的人并不多而已!
org.hibernate.hql.internal.ast.QueryTranslatorImpl;

具体的代码实现。


[java] view plain copy print?
  1. package app.dao.util;  
  2.   
  3. import lombok.Getter;  
  4. import lombok.Setter;  
  5. import org.hibernate.SessionFactory;  
  6. import org.hibernate.hql.internal.ast.QueryTranslatorImpl;  
  7. import org.hibernate.internal.SessionFactoryImpl;  
  8. import org.springframework.stereotype.Repository;  
  9.   
  10. import javax.annotation.Resource;  
  11. import java.util.Collections;  
  12. import java.util.List;  
  13.   
  14.   
  15. @Repository("hibernateUtil")  
  16. public class HibernateUtil {  
  17.     @Resource(name = "sessionFactory")  
  18.     @Getter  
  19.     @Setter  
  20.     private  SessionFactory sessionFactory;  
  21.   
  22.     /** 
  23.      * 将hql语句转换为sql语句,无参数 
  24.      * 
  25.      * @param hql 要转换的hql语句 
  26.      * @return 可执行的sql语句, 当返回null, 可以通过getResultMsg()方法查看处理结果信息 
  27.      */  
  28.     public  String transHqlToSql(String hql) {  
  29.         // 当hql为null或空时,直接返回null  
  30.         if (hql == null || hql.equals("")) {  
  31.             return "";  
  32.         }  
  33.         // 获取当前session  
  34.         // 得到session工厂实现类  
  35.         SessionFactoryImpl sfi = (SessionFactoryImpl) sessionFactory;  
  36.         // 得到Query转换器实现类  
  37.         QueryTranslatorImpl queryTranslator = new QueryTranslatorImpl(hql, hql, Collections.EMPTY_MAP, sfi);  
  38.         queryTranslator.compile(Collections.EMPTY_MAP, false);  
  39.         // 得到sql  
  40.         String sql = queryTranslator.getSQLString();  
  41.         return sql;  
  42.     }  
  43.   
  44.     /** 
  45.      * 将hql语句转换为sql语句,不需要格式化参数的情况 
  46.      * 
  47.      * @param hql         要转换的hql语句 
  48.      * @param paramValues hql参数值列表,注意与参数的顺序一致 
  49.      * @return 可执行的sql语句, 当返回null, 可以通过getResultMsg()方法查看处理结果信息 
  50.      */  
  51.     public  String transHqlToSql(String hql, List paramValues) {  
  52.         // 要返回的sql语句  
  53.         String sql = transHqlToSql(hql);  
  54.         // 当为null或空时,返回null  
  55.         if (sql == null || sql.equals("")) {  
  56.             return null;  
  57.         }  
  58.         // 赋参数值  
  59.         if (paramValues != null && paramValues.size() > 0) {  
  60.             for (int i = 0; i < paramValues.size(); i++) {  
  61.                 sql = sql.replaceFirst("\\?""\\'" + paramValues.get(i).toString() + "\\'");  
  62.             }  
  63.         }  
  64.         return sql;  
  65.     }