DetachedCriteria query = DetachedCriteria.forClass(SysNotice.class,"sysNotice1");
/*定义子查询对象并命名别名*/
DetachedCriteria querySon = DetachedCriteria.forClass(SysNoticeVisit.class,"sysNoticeVisit");
query.setProjection(Projections.rowCount()); //查询行数
query.add(Restrictions.eq("sysNotice1.isShow", true));
query.add(Restrictions.eq("sysNotice1.isPublication", true));
query.add(Restrictions.eq("sysNotice1.isCancel", false));
query.add(Restrictions.le("sysNotice1.effectDateFrom", new Date()));
query.add(Restrictions.ge("sysNotice1.effectDateTo", new Date()));
querySon.add(Restrictions.eq("sysNoticeVisit.visitor.userId", getCurrentUser().getUserId()));
/*添加子查询与主查询的主外键关联关系,若有多个条件则适当增加*/
querySon.add(Property.forName("sysNotice1.noticeId").eqProperty("sysNoticeVisit.sysNotice"));
/*添加子查询的查询内容,至少有一个,否则会报错,此处可以随便添加子查询的任何属性不影响主查询的数据输出。*/
query.add(Subqueries.notExists(querySon.setProjection(Projections.property("sysNoticeVisit.visitId"))));
ArrayList<Restrictions> arrayList = new ArrayList<Restrictions>();
Disjunction dis = Restrictions.disjunction();
dis.add(Restrictions.isNull("sysNotice1.sysDepartment.departmentId"));
for (int i = 0; i < deptIds.length; i++) {
dis.add(Restrictions.eq("sysNotice1.sysDepartment.departmentId", deptIds[i]));
}
query.add(dis);
Integer count=(Integer) query.getExecutableCriteria(getSession()).uniqueResult();
sql :
/*定义子查询对象并命名别名*/
DetachedCriteria querySon = DetachedCriteria.forClass(SysNoticeVisit.class,"sysNoticeVisit");
query.setProjection(Projections.rowCount()); //查询行数
query.add(Restrictions.eq("sysNotice1.isShow", true));
query.add(Restrictions.eq("sysNotice1.isPublication", true));
query.add(Restrictions.eq("sysNotice1.isCancel", false));
query.add(Restrictions.le("sysNotice1.effectDateFrom", new Date()));
query.add(Restrictions.ge("sysNotice1.effectDateTo", new Date()));
querySon.add(Restrictions.eq("sysNoticeVisit.visitor.userId", getCurrentUser().getUserId()));
/*添加子查询与主查询的主外键关联关系,若有多个条件则适当增加*/
querySon.add(Property.forName("sysNotice1.noticeId").eqProperty("sysNoticeVisit.sysNotice"));
/*添加子查询的查询内容,至少有一个,否则会报错,此处可以随便添加子查询的任何属性不影响主查询的数据输出。*/
query.add(Subqueries.notExists(querySon.setProjection(Projections.property("sysNoticeVisit.visitId"))));
ArrayList<Restrictions> arrayList = new ArrayList<Restrictions>();
Disjunction dis = Restrictions.disjunction();
dis.add(Restrictions.isNull("sysNotice1.sysDepartment.departmentId"));
for (int i = 0; i < deptIds.length; i++) {
dis.add(Restrictions.eq("sysNotice1.sysDepartment.departmentId", deptIds[i]));
}
query.add(dis);
Integer count=(Integer) query.getExecutableCriteria(getSession()).uniqueResult();
sql :
Hibernate打印出的:
SELECT
count(*) AS y0_
FROM
sys_notice this_
WHERE
this_.is_show =?
AND this_.is_publication =?
AND this_.is_cancel =?
AND this_.effect_date_from <=?
AND this_.effect_date_to >=?
AND NOT EXISTS (
SELECT
sysNoticeVisit_.visit_id AS y0_
FROM
sd12345.sys_notice_visit sysNoticeVisit_
WHERE
sysNoticeVisit_.user_id =?
AND this_.notice_id = sysNoticeVisit_.notice_id
)
AND (
this_.department_id IS NULL
OR this_.department_id =?
OR this_.department_id =?
)