【问题标题】:Filter a criteria query by a subquery attribute按子查询属性过滤条件查询
【发布时间】:2016-03-09 12:49:11
【问题描述】:

我正在尝试实现一个有点复杂的标准。
我的第一个问题是这样的。

SELECT * FROM pin AS activepin
WHERE activepin.pin_nbr NOT IN 
( 
 SELECT p.pin_nbr 
 FROM pin AS p 
 GROUP BY p.pin_nbr,p.is_active 
 HAVING p.is_active = 0 
 AND count(*) =( 
    SELECT count(*) 
    FROM pin 
    WHERE pin_nbr = p.pin_nbr 
    GROUP BY pin_nbr)
 );

所以,为了将have转换为where子句(我认为have和criteria不是好朋友xD),我将其转换为这个:

SELECT *
FROM pin AS activePin
WHERE activePin.pin_nbr NOT IN (
    SELECT innerQuery2.pin_nbr
    FROM(
        SELECT p.pin_nbr,
               p.is_active,
               count(*) AS quantity
        FROM pin p
        GROUP BY p.pin_nbr,
                 p.is_active) AS innerQuery2
     WHERE innerQuery2.is_active = 0
     AND innerQuery2.quantity =(
         SELECT count(*)
         FROM pin
         WHERE pin_nbr = innerQuery2.pin_nbr
         GROUP BY pin_nbr
         )
 );

然后我做了这个标准

        DetachedCriteria innerQuery3 = DetachedCriteria.forClass(Pin.class, "innerQuery3")
                .setProjection(Projections.rowCount())
                .setProjection(Projections.groupProperty("innerQuery3.pinNbr"))
                .add(Restrictions.eq("innerQuery2.pinNbr", "pinNbr"));

        DetachedCriteria innerQuery2 = DetachedCriteria.forClass(Pin.class, "innerQuery2")
                .setProjection(Projections.rowCount())
                .setProjection(Projections.groupProperty("innerQuery2.pinNbr"))
                .setProjection(Projections.groupProperty("innerQuery2.active"))
                .add(Subqueries.eq(Projections.rowCount(), innerQuery3))
                .add(Restrictions.eq("innerQuery2.pinNbr", "pinNbr"));

        DetachedCriteria innerQuery1 = DetachedCriteria.forClass(Pin.class, "innerQuery1")
                .setProjection(Projections.property("innerQuery2.pinNbr"))
                .add(Subqueries.exists(innerQuery2))
                .add(Restrictions.eq("innerQuery2.active", false));

        criteria.add(Subqueries.propertyNotIn("pinNbr", innerQuery1));

这会抛出以下异常

org.hibernate.MappingException:未知实体:null

我认为发生这种情况是因为我通过子查询值添加了限制(我介意,在 innerQuery1 我想通过 innerQuery2 值进行过滤,那是因为我想在 group 子句之后进行过滤)。

关于如何做到这一点的任何线索?我一直在研究如何通过子查询之外的子查询值进行过滤而没有结果。

提前致谢。

【问题讨论】:

    标签: java sql hibernate criteria


    【解决方案1】:
    SELECT p.pin_nbr 
           SUM(CASE WHEN p.is_active = 0 THEN 0 ELSE 1 END) as sum_active
           count(*) as total
    FROM pin AS p 
    GROUP BY p.pin_nbr
    HAVING total!=sum_active
    

    让我们先重写 SQL 查询。据我了解,您需要所有项目都处于活动状态的所有 pin_nbr。

    您可以将Projections.sqlProjection() 用于上述表达式。对于查询,您在 java 端添加 HAVING 检查或将其放在子查询中。

    【讨论】:

    • 你摇滚!从该查询中制定标准要容易得多,最后我避免了 HAVING 子句并检查 java 中的活动引脚。顺便说一句,你的猜测是正确的,我需要所有项目都处于活动状态的所有 pin_nbr。
    猜你喜欢
    • 1970-01-01
    • 2015-08-05
    • 2016-05-22
    • 2013-06-07
    • 2017-03-24
    • 1970-01-01
    • 2020-04-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多