我们希望在查询中集成计算字段。
此计算字段使用简单的SELECT MAX(x) FROM table2
获得。
但是在我们的主查询中,如果我们想要对这个计算字段进行过滤,我们必须将它集成到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;
带有Criteria&的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))
我们不能用Long的List / Array替换5L。
有什么想法吗? 感谢
nb:我们必须使用Criteria。客户端拒绝本机HQL或SQL。
答案 0 :(得分: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)