解决HQL不能再distinct、group by 上使用count问题。并且解决了HQL命名参数占位传值问题(Map类型参数)
public Long getDataTotal(String hql,Map<String,Object> alias,Object[] args) {
QueryTranslatorImpl queryTranslator = new QueryTranslatorImpl(hql, hql,
Collections.EMPTY_MAP, (SessionFactoryImplementor) this.getSessionFactory());
queryTranslator.compile(Collections.EMPTY_MAP, false);
String tempSQL = queryTranslator.getSQLString();
String countSQL = "select count(*) from (" + tempSQL + ") tmp_count_t";
SQLQuery sqlQuery = createSQLQuery(countSQL);
if (null != alias){
for (String name : (Set<String>) alias.keySet()) {
//sample parameter
int[] indexs = queryTranslator.getNamedParameterLocs(name);
//when use a instance have question
//parameter isn't sql class have question
//use invoke to set parameter.
Object value = alias.get(name);
for (int index : indexs) {
//set sql parameter
sqlQuery.setParameter(index, value);
}
}
}
if(args!=null){
for (int i = 0; i < args.length; i++) {
sqlQuery.setParameter(i, args[i]);
}
}
return Long.valueOf(sqlQuery.uniqueResult().toString());
}
private SQLQuery createSQLQuery(final String sql){
return this.getSession().createSQLQuery(sql);
}
进一步分装可用参考:(需要自己重新实现,摘自网络)
private SQLQuery createSQLQuery(final String sql,final List<?extends Object> params){
return this.createSQLQuery(sql, params, null);
}
private SQLQuery createSQLQuery(final String sql,final List<?extends Object> params,Boolean splitParams){
SQLQuery sqlQuery=this.createSQLQuery(sql);
if(splitParams==null||splitParams==false){
if (params != null && !params.isEmpty()) {
int size = params.size();
for (int i = 0; i < size; i++) {
sqlQuery.setParameter(i, params.get(i));
}
}
}else{
if (params != null && !params.isEmpty()) {
sqlQuery.setParameter(0, params);
}
}
return sqlQuery;
}
private SQLQuery createSQLQuery(final String sql,final Map<String,?extends Object> namedParames){
SQLQuery sqlQuery=this.createSQLQuery(sql);
if(namedParames!=null&&!namedParames.isEmpty()){
Iterator iter = namedParames.entrySet().iterator();
while (iter.hasNext()) {
Map.Entry entry = (Map.Entry) iter.next();
sqlQuery.setParameter((String)entry.getKey(), entry.getValue());
}
}
return sqlQuery;
}