У меня есть запрос hql, у которого есть группа. В результате разбивки на страницы я хочу получить подсчет всех результатов, отображаемых в разбивке на страницы. В запросе, который не имеет группы по. Я пишу утилиту, которая создает счетчик запросов из запроса hql, подобного этому
select u
from Personel u
where u.lastname='azizkhani'
я нахожу основное ключевое слово "from" и подстроку hql и добавляю count (*), а затем делаю этот запрос
select count(*)
from Personel u
where u.lastname='azizkhani'
когда у меня есть запрос, содержащий группу, я не могу сделать это так
select u.lastname,count(*)
from Personel u
group by u.lastname;
количество этого запроса в sql равно
select count(*)
from (
select u.lastname,count(*)
from tbl_personel u
group by u.lastname
)
как я могу сгенерировать группу по запросу из hql ??
У меня есть GenericRepository, у которого есть такой метод
public <U> PagingResult<U> getAllGrid(String hql,Map<String, Object> params,PagingRequest searchOption);
и разработчик называет это так
String hqlQuery = " select e from Personel e where 1<>2 and e.lastname=:lastname";
HashMap<String, Object> params = new HashMap<String, Object>();
params.put("lastname", 'azizkhani');
return getAllGrid(hqlQuery, params, new PagingRequest( 0/*page*/, 10 /*size*/) );
в GenericRepository я верну объект PagingResult, у которого есть свойство
public class PagingResult<T> {
private int totalElements;
@JsonProperty("rows")
private List<T> items;
public PagingResult() {
}
public PagingResult(int totalElements, List<T> items) {
super();
this.totalElements = totalElements;
this.items = items;
}
public int getTotalElements() {
return totalElements;
}
public void setTotalElements(int totalElements) {
this.totalElements = totalElements;
}
public List<T> getItems() {
return items;
}
public void setItems(List<T> items) {
this.items = items;
}
}
В GenericRepository я выполню два запроса, первый для получения результата 10 и второй для получения totalRecords. Разработчик просто отправит Hql. Я сделаю hql для получения totalcount. для запроса, который не имеет "отличных" или "группировать по", я делаю hql. но когда в hql есть "отдельные" и "группировать по", у меня есть проблема.
public <U> PagingResult<U> getAllGrid(String hql, Map<String, Object> params, PagingRequest searchOption) {
Session session = getSession();
applyDafaultAuthorizeFilter(session);
Query query = session.createQuery(hql);
if (searchOption != null) {
if (searchOption.getSize() > 0) {
query.setFirstResult(searchOption.getPage() * searchOption.getSize());
query.setMaxResults(searchOption.getSize());
}
}
if (params != null)
HQLUtility.setQueryParameters(query, params);
List<U> list = query.getResultList();
Query countQuery = session.createQuery("select count(*) " + HQLUtility.retriveCountQueryFromHql(hql));
if (params != null)
HQLUtility.setQueryParameters(countQuery, params);
int count = ((Long) countQuery.uniqueResult()).intValue();
if (searchOption != null)
return new PagingResult<U>(searchOption.getPage(), count, searchOption.getSize(), list);
else
return new PagingResult<U>(0, count, 0, list);
}
public static StringBuffer retriveCountQueryFromHql(StringBuffer jql) {
if(jql.indexOf("order by")>=0)
jql.replace(jql.indexOf("order by"), jql.length(),"");
String mainQuery = jql.toString();
jql = new StringBuffer(jql.toString().replace('\t', ' '));
int firstIndexPBas = jql.indexOf(")");
int firstIndexPBaz = jql.lastIndexOf("(", firstIndexPBas);
while (firstIndexPBas > 0) {
for (int i = firstIndexPBaz; i < firstIndexPBas + 1; i++)
jql.replace(i, i + 1, "*");
firstIndexPBas = jql.indexOf(")");
firstIndexPBaz = jql.lastIndexOf("(", firstIndexPBas);
}
int Indexfrom = jql.indexOf(" from ");
return new StringBuffer(" " + mainQuery.substring(Indexfrom, jql.length()));
}
public void applyDafaultAuthorizeFilter(Session session) {
Filter filter = session.enableFilter("defaultFilter");
filter.setParameter("userId", SecurityUtility.getAuthenticatedUserId());
filter.setParameter("orgId", SecurityUtility.getAuthenticatedUserOrganization().getId());
}
как я могу решить эту проблему без изменения подписи моего GenericRepository ???
Я думаю, у меня есть решение, которое конвертирует hql в sql и создает собственный запрос, подобный этому select count (*) from (hql_to_sql), но у меня две проблемы
- hql в дозу sql не имеет api, поддерживающего параметр
- hql в дозу sql не имеет API, поддерживающего фильтр гибернации