2014-09-17 3 views
1

У меня есть две таблицы:Hibernate Критерии запроса без связь между сущностями

A (x, y, z, date1, date2) 
B (t, date1, date2) 

Я хочу, чтобы выполнить запрос, как это:

SELECT A.x, A.y, A.z, A.date1 
FROM A, B 
WHERE A.date1 < B.date1 
AND (A.date2 is null or A.date2 <= B.date2) 
ORDER BY A.x DESC; 

Как я могу это сделать с помощью Hibernate Criteria?

ответ

1
String   dateIdValue = "..."; 
Class<?>   mainClass  = A.class; 
Class<?>   dateClass  = B.class; 

String   colDate1  = "date1"; 
String   colDate2  = "date2"; 
String   colDateId  = "id"; 

Property   date1Prop  = Property.forName(colDate1); 
Property   date2Prop  = Property.forName(colDate2); 

DetachedCriteria date1Criteria = DetachedCriteria.forClass(dateClass) 
               .setProjection(date1Prop) 
               .add(Restrictions.eq(colDateId, dateIdValue)); 
DetachedCriteria date2Criteria = DetachedCriteria.forClass(dateClass) 
               .setProjection(date2Prop) 
               .add(Restrictions.eq(colDateId, dateIdValue)); 

Criteria   criteria  = getSession().createCriteria(mainClass) 
           .add(date1Prop.lt(date1Criteria)) 
           .add(Restrictions.or(date2Prop.isNull(), date2Prop.le(date2Criteria))) 
           .addOrder(Order.desc("x")); 

/* 
    SELECT A.* 
    FROM A, P 
    WHERE A.date1 < P.date1 
    AND (A.date2 is null or A.date2 <= P.date2) 
    ORDER BY A.x DESC; 
*/ 
+0

Не могли бы вы объяснить, что такое 'colDateId' и' dateIdValue'? – seal

0

Использование подзапросов. Что-то вроде этого.

select a,b,c,date3 
     from A 
     where date3 is null or 
     date3 < (select p.date1 from P p) 
     order by a desc; 

ОДНАКО! Если у вас нет сопоставленных отношений между сущностями, это не то, для чего предназначен Hibernate, и, вероятно, лучше использовать SQL напрямую.

+0

Я не хочу писать sql или hql или jpql. Я хочу получить результаты с использованием API критериев. – yetAnotherSE

+0

@mmdemirbas сделал что-то похожее на мое предложение в API критериев. Хотя, если этот запрос является действительной частью бизнеса, это должно позволить доменное сопоставление. – carbontax

Смежные вопросы