hibernate将hql转换成count(*)的方法,支持所有的数据库oracle,mysql等

  1. protected String prepareCountHql(String hql) {
  2. //String sql = “select b.id, b.user_name, b.create_date from users b “;
  3. //ParameterMetadata parameterMetadata = getQueryPlanCache().getSQLParameterMetadata(sql);
  4. // NativeSQLQuerySpecification spec = new NativeSQLQuerySpecification();
  5. // getQueryPlanCache().getNativeSQLQueryPlan(spec);
  6. //SQLQuery sqlQuery = createSqlQuery(sql, User.class);
  7. // System.out.println(Arrays.toString(sqlQuery.getReturnAliases()));
  8. // System.out.println(Arrays.toString(sqlQuery.getReturnTypes()));
  9. //Object objects = sqlQuery.list();
  10. // getCountSql(hql, sessionFactory);
  11. String fromHql = hql;
  12. fromHql = “from” + StringUtils.substringAfter(fromHql, “from”);
  13. fromHql = StringUtils.substringBefore(fromHql, “order by”);
  14. int whereIndex = fromHql.indexOf(“where”);
  15. int leftIndex = fromHql.indexOf(“left join”);
  16. if (leftIndex >= 0) {
  17. if (whereIndex >= 0) {
  18. String temp = StringUtils.substringBefore(fromHql, “left”);
  19. fromHql = temp + ” where ” + StringUtils.substringAfter(fromHql, “where”);
  20. } else {
  21. fromHql = StringUtils.substringBefore(fromHql, “left”);
  22. }
  23. }
  24. String countHql = “select count(*) ” + fromHql;
  25. return countHql;
  26. }
  27. protected String getCountSql(String originalHql, SessionFactory sessionFactory) {
  28. //long d = System.nanoTime();
  29. SessionFactoryImplementor sessionFactoryImplementor = (SessionFactoryImplementor) sessionFactory;
  30. HQLQueryPlan hqlQueryPlan = sessionFactoryImplementor.getQueryPlanCache().getHQLQueryPlan(originalHql, false, Collections.emptyMap());
  31. String[] sqls = hqlQueryPlan.getSqlStrings();
  32. //System.out.println(Arrays.toString(sqls));
  33. // System.out.println(Arrays.toString(hqlQueryPlan.getReturnMetadata()
  34. // .getReturnAliases()));
  35. // System.out.println(Arrays.toString(hqlQueryPlan.getReturnMetadata()
  36. // .getReturnTypes()));
  37. // QueryTranslatorImpl queryTranslator = new
  38. // QueryTranslatorImpl(originalHql, originalHql, Collections.emptyMap(),
  39. // sessionFactoryImplementor);
  40. //
  41. // //org.hibernate.hql.internal.ast.QueryTranslatorImpl queryTranslator2
  42. // = new org.hibernate.hql.internal.ast.QueryTranslatorImpl(originalHql,
  43. // originalHql, Collections.emptyMap(), sessionFactoryImplementor);
  44. //
  45. // queryTranslator.compile(Collections.EMPTY_MAP, false);
  46. // String countSql = “select count(*) from (” +
  47. // queryTranslator.getSQLString() + “) tmp_count_t”;
  48. String countSql = “select count(*) from (” + sqls[0] + “) count”;
  49. //System.out.println(System.nanoTime() – d);
  50. return countSql;
  51. }
  52. public SessionFactoryImplementor getSessionFactoryImplementor() {
  53. return (SessionFactoryImplementor) getSessionFactory();
  54. }
  55. public QueryPlanCache getQueryPlanCache() {
  56. return getSessionFactoryImplementor().getQueryPlanCache();
  57. }
  58. public HQLQueryPlan getHqlQueryPlan(String hql) {
  59. return getQueryPlanCache().getHQLQueryPlan(hql, false, Collections.emptyMap());
  60. }
  61. protected String prepareCountSql(String sql) {
  62. // String fromSql = sql;
  63. // fromSql = “from” + StringUtils.substringAfter(fromSql, “from”);
  64. // fromSql = StringUtils.substringBefore(fromSql, “order by”);
  65. // String countSql = “select count(*) count ” + fromSql;
  66. // return countSql;
  67. return getCountSql(sql, getSessionFactory());
  68. }

标签