Hibernate Criteria 级联查询(含子查询和联合主键) 10
TABLEA(id,type1,type2)id是主键TABLEB(idType1,idType2)其中(idType1,idType2)是联合主键eg:Aidtype1...
TABLE A ( id, type1, type2) id 是主键
TABLE B (idType1,idType2) 其中 (idType1,idType2) 是联合主键
eg:
A id type1 type2
1 t1 null
2 null t2
3 t1 null
4 null t2
B :
idType1 idType2
1 2
1 4
3 2
3 4
SELECT
a.*
FROM
A a
WHERE
a.type1 = 't1'
and a.id in (
SELECT
b.idType2
FROM
B b
WHERE
b.idType1 = 1
)
请用 Hibernate 的 Criteria 来实现这句SQL
要直接拿到结果集。不要先搜出来 List<Long> idType2 作为条件再作第二次搜索
Criteria criteria = this.getSession().createCriteria(A.class);
DetachedCriteria detachedCriteria = DetachedCriteria.forClass(B.class); detachedCriteria.setProjection( Projections.projectionList()
.add(Projections.groupProperty("id.idType2"))
);
detachedCriteria.add(Restrictions.eq("id.idType1", aid));
criteria.add(Subqueries.propertyIn("id", detachedCriteria));
criteria.add(Restrictions.eq("type1", a.type1));
if (criteria.list().size() > 0) {
return (A) criteria.list().get(0);
} else {
return null;
}
这个事我目前的做法, 但是总是报 类型转换错误(String -> Long),不知道怎么解决, 我也不清楚是不是当中有哪一步写错了或者漏了什么。 请高手指教! 展开
TABLE B (idType1,idType2) 其中 (idType1,idType2) 是联合主键
eg:
A id type1 type2
1 t1 null
2 null t2
3 t1 null
4 null t2
B :
idType1 idType2
1 2
1 4
3 2
3 4
SELECT
a.*
FROM
A a
WHERE
a.type1 = 't1'
and a.id in (
SELECT
b.idType2
FROM
B b
WHERE
b.idType1 = 1
)
请用 Hibernate 的 Criteria 来实现这句SQL
要直接拿到结果集。不要先搜出来 List<Long> idType2 作为条件再作第二次搜索
Criteria criteria = this.getSession().createCriteria(A.class);
DetachedCriteria detachedCriteria = DetachedCriteria.forClass(B.class); detachedCriteria.setProjection( Projections.projectionList()
.add(Projections.groupProperty("id.idType2"))
);
detachedCriteria.add(Restrictions.eq("id.idType1", aid));
criteria.add(Subqueries.propertyIn("id", detachedCriteria));
criteria.add(Restrictions.eq("type1", a.type1));
if (criteria.list().size() > 0) {
return (A) criteria.list().get(0);
} else {
return null;
}
这个事我目前的做法, 但是总是报 类型转换错误(String -> Long),不知道怎么解决, 我也不清楚是不是当中有哪一步写错了或者漏了什么。 请高手指教! 展开
展开全部
你那几个字段哪个是long型哪个是string型?是hibernate报错还是java报错?
追问
id 是 Long
type 都是 String
idType 都是 Long
hibernate 的错。
昨天 怎么都不行,但是今天早上过来试了一下居然又通过了。。。 so weird!!
追答
.....
那只能恭喜你通过了。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
你用SQL吧
更多追问追答
追问
用 SQL 就 不头疼了。 客户的需求,只能用 Criteria 不能用 Query
追答
HQL都是操作数据表映射到实体类的 你还是取出来一个集合在程序里操作吧 本来Hibernate 就不太好用
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
还没用过Projections聚合查询, 改天试试....
追问
其实,个人觉得,如果不是客户需求,或者其他特殊的要求(比如要用hibernate来兼容各种不同的数据库)的话,还是SQL最好用 最实惠。。
追答
从技术角度来说,SQL固然简单、实惠。不过作为技术研究来说还是学学比较好啊。:D
客户没有要求我一般会根据进度情况来决定我所用的技术,因为客户是不可能知道我使用哪一种技术来实现的。如果有要求性能的,则看是否符合性能要求,如果在性能要求范围之内则无所谓
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询