2017-01-13 5 views
0

У меня есть запрос Hibernate, чтобы получить список строк, ограниченных номером maximun. Но когда я читаю журналы Hibernate, к моему удивлению, он фильтрует внутренне подзапрос, который имеет только одну строку select count(*)Почему Hibernate регистрирует другой запрос, который он фактически не выполняет?

-- Log4j 
-- INFO [STDOUT] Hibernate: 
select * 
from (select count(*) as y0_ 
     from yyy this_ 
     where this_.type=3 and 
        this_.VALUE=2 and 
        this_.src='ZZZZZ' 
    ) 
where rownum <= 100; 

Критерии Outter это так:

criteria.setProjection(Projections.rowCount()); 
criteria.setMaxResults(MAX_RESULTS); // MAX_RESULTS = 100 

final List results = criteria.list(); // It executes the above query here. 

Что такое объяснение этому поведение? У меня больше запросов с этим вводящим в заблуждение результатом в журналах.

ответ

2

Вы устанавливаете проекцию отсчета. Это делает спящий режим возвращает количество:

select count(*) from ... 

Тогда вы рассказываете Hibernate, хотя нет никакого способа, чтобы получить больше, чем одна строка для такого запроса, чтобы ограничить список возвращаемых строк до максимум 100 строк. Правильный способ сделать это с помощью базы данных, чтобы делать то, что делает Hibernate:

select * from (<original query>) where rownum <= 100; 

Если вы не хотите, что бесполезный оберточной запроса, то просто не называют бесполезный setMaxResults(100) метода.

+0

Я имею в виду, что setMaxResulst фактически фильтрует полученные данные на 100. Это необходимо. Я делаю внутренний запрос и имеет, например, 1500 возвращаемых значений, поэтому мне нужен фильтр 100, чтобы не перегружать. Он фильтрует по назначению. Но, с другой стороны, Hibernate интерпретирует запрос по-другому, например, если он имеет только 1 счетчик (*). Я буду обновлять вопрос с помощью внутреннего запроса. Спасибо за ваш быстрый ответ. – another

+0

Запрос, выполняющий select count (*), без какой-либо группы, не может возвращать более 1 строки. Он никогда не вернет 1500 строк. –

+0

Я буду расширять код, я мог бы сгладить некоторый код. – another