2016-01-28 3 views
1

Что я хочу достичь: Получите список уникальных идентификаторов, заказанных другим столбцом, используя критерии гибернации.Hibernate-Criteria: выберите отдельный столбец из таблицы, заказанной другим столбцом

Мой код до сих пор:

Criteria crt = createCriteria(); //complex method returning Criteria 
            //with joined tables, restrictions and ordering 
crt.setProjection(Projections.distinct(Projections.property("id"))); 
List<Integer> ids = crt.list(); 

Что не так: Когда я установил порядок по столбцам, скажем, "дата" Я получаю запрос:

SELECT DISTINCT id FROM table \\JOIN, WHERE...\\ ORDER BY date); 

, который, очевидно, неправильно и приводит к ошибке:

ORA-01791: not a SELECTed expression 

Моя идея, как решить: Каким-то образом заставить Hibernate генерировать этот запрос:

SELECT DISTINCT id FROM (SELECT * FROM table \\JOIN, WHERE...\\ ORDER BY date); 

проблемы и то, что я пытался: Существует createCriteria() метод, который я не хочу, чтобы изменить, если это не совершенно необходимо. Я не нашел способ использовать этот критерий как DetachedCriteria.

+0

Вы можете изменить отдельные критерии к нормальному, если это помогает. –

ответ

1

Вы не можете поместить подзапросы в предложение FROM с критериями.

Bug вы можете:

  • Использование HQL
  • Используйте обычный SQL
  • Изменить для запроса

это идентификатор не уникален так или иначе? Так почему бы просто не поставить дату в предложение select? Это изменит результат, за исключением того, что вы получите другой столбец в результате.

SELECT distinct date, id 
FROM table 
ORDER BY date 

Другой подход:

SELECT min(date), id 
FROM table 
GROUP BY id 
ORDER BY min(date) 

Что-то вроде этого:

createCriteria(SomeTable.class) 
    .setProjection(Projections.projectionList() 
    .add(Projections.groupProperty("id")) 
    .add(Projections.min("date"), "minDate") 
    .add(Order.desc("minDate")) 
+0

Запрос слишком сложный для использования HQL или простого SQL. Идентификатор уникален, но я присоединяюсь к таблицам, и один идентификатор может появляться несколько раз. 'crt.setResultTransformer (Criteria.DISTINCT_ROOT_ENTITY);' не помогает, потому что я использую также 'setFirstResult' и' setMaxResults', и я получаю недостаточно данных. И когда я помещаю «дату» в предложение select, я не получаю отдельный идентификатор ... –

+0

Я вижу. У меня была другая идея. Надеюсь, поможет. –