如何将子查询用于where子句?

时间:2016-08-29 08:53:14

标签: java hibernate subquery criteria

我们希望在查询中集成计算字段。 此计算字段使用简单的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。

1 个答案:

答案 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)