【发布时间】: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