案例:
/**
* 客户拜访计划
*
**/
@Entity
@Table(name = "cus_visit")
public class Visit {
/**
* 同行人
*/
private Set<Employee> partners;
@ManyToMany(targetEntity = Employee.class, cascade = { CascadeType.MERGE },fetch = FetchType.LAZY)
@Cascade(value = { org.hibernate.annotations.CascadeType.SAVE_UPDATE,org.hibernate.annotations.CascadeType.DELETE })
@JoinTable(name = "cus_visit_employee", joinColumns = { @JoinColumn(name = "visit_id") }, inverseJoinColumns = { @JoinColumn(name = "employee_id") })
@Fetch(FetchMode.SELECT)
public Set<Employee> getPartners() {
return partners;
}
public void setPartners(Set<Employee> partners) {
this.partners = partners;
}
}
Criteria创建:
Criteria criteria = getSession().createCriteria(Visit.class)
.setFirstResult(pageInfo.getStartIndex())
.setMaxResults(pageInfo.getNumPerPage());
查询条件
private void addQueryCause(Criteria criteria, Visit visit) {
criteria.createAlias("partners", "partner");
if(visit.getPartners()!=null){
Set<Employee> partnerSet = visit.getPartners();
for(Employee employee :partnerSet){
criteria.add(Restrictions.or(Restrictions.like(
"partner.empNo", employee.getEmpNo(),MatchMode.ANYWHERE),Restrictions.like(
"partner.name", employee.getName(),MatchMode.ANYWHERE)));
}
}
//其他查询条件...
}
第一种:对查询完毕之后的结果进行Distinct
addQueryCause(idsOnlyCriteria, visit);
criteria.setResultTransformer(criteria.DISTINCT_ROOT_ENTITY);
return criteria.list();
第二种:只查询一个属性,并对这个属性进行Distinct
addQueryCause(idsOnlyCriteria, visit);
criteria.setProjection(Projections.distinct(Projections.id()));
return criteria.list();
第三种:使用子查询,实现整条记录的Distinct
DetachedCriteria idsOnlyCriteria = DetachedCriteria.forClass(Visit.class);
idsOnlyCriteria.setProjection(Projections.distinct(Projections.id()));
addQueryCause(idsOnlyCriteria, visit);
criteria.add(Subqueries.propertyIn("id", idsOnlyCriteria));
return criteria.list();
第三种实现依赖于第二种功能,把条件都放到对id查询的限制上,之后在查询主记录只需要使主键IN子查询结果就行了。最后生成的SQL语句:
select
this_.id as id1_61_0_,
....
from
cus_visit this_
where
this_.id in (
select
distinct this_.id as y0_
from
cus_visit this_
left outer join
cus_visit_employee partners3_
on this_.id=partners3_.visit_id
left outer join
core_employee partner1_
on partners3_.employee_id=partner1_.emp_no
where
(
this_.planer=?
or partner1_.emp_no=?
)
)
order by
this_.id asc limit ?
分享到:
相关推荐
Hibernate Criteria 排序的問題
Hibernate 中 Criteria 的完整用法 Hibernate 的 Criteria...Hibernate 的 Criteria 是一种强大且灵活的查询机制,提供了多种方法来满足开发中查询条件的创建和组装。Criteria 的使用可以提高查询效率,降低开发难度。
关于Hibernate操作持久化类的Criteria方式的书本方法
Hibernate的Criteria用法总结Hibernate的Criteria用法总结
hibernate criteria 分组 排序 关联 hibernate criteria 分组 排序 关联
Criteria查询将数据查询条件封装成为一个对象,可以堪称是传统SQL的对象化表示。
hibernate criteria的使用方法
Criteria 查询机制主要包括 QBE(Query By Example)、QBC(Query By Criteria)和 HQL(Hibernate Query Language)三种方式。 QBE(Query By Example) QBE 是一种基于示例的查询机制,它可以根据一个示例对象来...
这个案例是根据分组查询,并且得到每组的条数,不懂得可以q我:1710086675,欢迎认识更多新朋友
Hibernate Criteria 完全使用详解
NULL 博文链接:https://chenlinbo.iteye.com/blog/335677
Hibernate中Criteria的完整用法 Criteria 是一个完全面向对象,可扩展的条件查询API,通过它完全不需要考虑数据库底层如何实现、SQL语句如何...
Hibernate中Criteria的使用,对于研究hibrnate源码有一些作用
Hibernate中Criteria的完整用法
hibernate-Criteria hibernate-Criteria hibernate-Criteria hibernate-Criteria hibernate-Criteria hibernate-Criteria
Hibernate 提供了操纵对象和相应的 RDBMS 表中可用的数据的替代方法。一种方法是标准的 API,它允许你建立一个标准的可编程查询对象来应用过滤规则和逻辑条件。 Hibernate Session 接口提供了 createCriteria() ...