2016-08-29 5 views
3

Мы хотели бы интегрировать в запрос вычисленное поле. Это расчетное поле получается простым SELECT MAX(x) FROM table2.Как использовать подзапрос в where where?

Но в нашем основном запросе, если мы хотим отфильтровать это вычисляемое поле, нам пришлось интегрировать его в предложение where.

Наша проблема заключается в интеграции подзапроса в состояние WHERE...IN.

Мы стараемся использовать функцию Subqueries.in, но проблема в том, что мы не можем ввести список значений.

Вот запрос SQL, который у нас был бы.

select 
    this_.DMDE_CEE_ID as y0_, 
    this_.DT_DMDE as y1_, 
    (select 
     max(this0__.STATUT) as y0_ 
    from 
     CS_FC_DMDE_CEE this0__ 
    where 
     this0__.DMDE_CEE_ID=this_.DMDE_CEE_ID limit 1) as y16_ 
from 
    xxx this_ 
where 
    (select 
     max(controleDemandeCee_.STATUT) as y0_ 
     from 
      CS_FC_DMDE_CEE controleDemandeCee_ 
     where 
      controleDemandeCee_.DMDE_CEE_ID=this_.DMDE_CEE_ID 
    ) IN (3,5) 
order by 
    this_.NOM_DOS asc, 
    this_.DT_DMDE asc limit 10; 

Здесь лучший результат мы можем иметь:

select 
    this_.DMDE_CEE_ID as y0_, 
    this_.DT_DMDE as y1_, 
    (select 
     max(this0__.STATUT) as y0_ 
    from 
     CS_FC_DMDE_CEE this0__ 
    where 
     this0__.DMDE_CEE_ID=this_.DMDE_CEE_ID limit 1) as y16_ 
from 
    xxx this_ 
where 
    5 IN (select 
     max(controleDemandeCee_.STATUT) as y0_ 
     from 
      CS_FC_DMDE_CEE controleDemandeCee_ 
     where 
      controleDemandeCee_.DMDE_CEE_ID=this_.DMDE_CEE_ID 
    ) 
order by 
    this_.NOM_DOS asc, 
    this_.DT_DMDE asc limit 10; 

код Java с критериями & подзапросов:

final DetachedCriteria dControleDemande = DetachedCriteria.forClass(ControleDemandeBean.class, CONTROLE);   
dControleDemande.add(Restrictions.eqProperty(CONTROLE_DEMANDE_ID, DMD_ID)); 
dControleDemande.setProjection(Projections.max(CONTROLE + ".statut.id")); 

cDmd.add(Subqueries.in(5L, dControleDemandeCee)) 

Мы не можем заменить 5л списком/массив Long ,

Любая идея? Спасибо

nb: мы должны использовать критерии. Клиент отказывается от родного языка HQL или SQL.

ответ

0

Вы могли бы реализовать пользовательские Criterion, которая делает что-то вроде

(select 
     max(controleDemandeCee_.STATUT) as y0_ 
     from 
      CS_FC_DMDE_CEE controleDemandeCee_ 
     where 
      controleDemandeCee_.DMDE_CEE_ID=this_.DMDE_CEE_ID 
) IN (5)