`
- 浏览:
23092 次
-
Hibernate使用Criteria分页关联查询去除重复
这里面role和user是多对多关系,比如一页显示15条数据,查询时查出来的user是15条,但是一旦有user对应多个role,这样显示的就没有15条数据了,在查询中单单加入
executableCriteria.setResultTransforme(Criteria.DISTINCT_ROOT_ENTITY);
这一句是不够的,这样只是查出15条数据,然后再去除重复的项,显示效果还是不对。
User类
@ManyToMany(fetch = FetchType.LAZY, cascade = { CascadeType.PERSIST,
CascadeType.MERGE, CascadeType.REFRESH })
@JoinTable(name = "system_user_role", joinColumns = @JoinColumn(name = "user_id"), inverseJoinColumns = @JoinColumn(name = "role_id"))
private List<Role> roleList = new ArrayList<Role>();
public List<Role> getRoleList() {
return roleList;
}
public void setRoleList(List<Role> roleList) {
this.roleList = roleList;
}
action类中的方法
public String list() {
CustomExample<User> example = new CustomExample<User>(this.getModel()) {
private static final long serialVersionUID = 1L;
public void appendCondition(Criteria criteria) {
entity.setValidFlag(ValidFlag.VALID);
criteria.addOrder(Order.asc("id")); List<Org> orgs2 = orgService.findAllOrgByParentid(user.getParent().getId());
Long[] orgids2 = new Long[orgs2.size() + 1];
int i = 0;
if (orgs2.size() > 0) {
for (Org org1 : orgs2) {
orgids2[i] = org1.getId();
i = i + 1;
}
criteria.add(Restrictions.in("parent.id", orgids2));
}
orgs = orgs2;
if (getOrgId() != null)
criteria.add(Restrictions.eq("parent.id", getOrgId()));
}
}
};
example.enableLike(MatchMode.ANYWHERE);
this.listResult = userService.findPageByExample(example,
PaginationSupport.pageToIndex(pageNum, numPerPage), numPerPage);
return LIST;
}
底层findPageByExample方法
DetachedCriteria executableCriteria1=DetachedCriteria.forClass(example.getEntityClass()).setFetchMode("roleList", FetchMode.SELECT);//将关联的rolelist集合对象采用查询方式抓取
executableCriteria=executableCriteria1.getExecutableCriteria(session);
executableCriteria = session.createCriteria(example
.getEntityClass());
executableCriteria.add(example);
example.appendCondition(executableCriteria);
int totalCount = ((Long) executableCriteria.setProjection(
Projections.rowCount()).uniqueResult()).intValue();
executableCriteria.setProjection(null);
executableCriteria
.setResultTransformer(CriteriaSpecification.ROOT_ENTITY);
for (int i = 0; orders != null && i < orders.length; i++) {
executableCriteria.addOrder(orders[i]);
}
executableCriteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY); //去除重复项
List items = executableCriteria.setFirstResult(startIndex)
.setMaxResults(pageSize).list();
PaginationSupport ps = new PaginationSupport(items, totalCount,
startIndex, pageSize);
return ps;
将关联的rolelist集合对象采用查询方式抓取
用这种方式取出的才是正确的数据
分享到:
Global site tag (gtag.js) - Google Analytics
相关推荐
总结,"Hibernate 多表连接分页查询示范项目"是一个实用的示例,它展示了如何在实际应用中利用 Hibernate Criteria API 实现复杂查询和分页,对于学习和掌握 Hibernate 的高级特性和数据库操作技巧非常有帮助。...
在深入探讨Hibernate与Criteria结合进行模糊查询之前,我们先来了解一下Hibernate和Criteria的基本概念,以及为何选择使用它们进行模糊查询。 ### Hibernate简介 Hibernate是一个开放源代码的对象关系映射(ORM)...
本篇文章将深入探讨如何使用Hibernate实现模糊查询和分页功能,这对于任何需要处理大量数据的应用程序来说都是至关重要的技能。 首先,让我们了解Hibernate的核心概念。Hibernate是一个开源的JPA(Java Persistence...
这个案例是根据分组查询,并且得到每组的条数,不懂得可以q我:1710086675,欢迎认识更多新朋友
### Hibernate Criteria 查询详解 #### 一、概述 Hibernate Criteria 查询是一种强大的对象化查询方式,它为开发者提供了一种灵活而直观的方式来构建复杂的查询逻辑。与传统的SQL查询相比,Criteria查询更加面向...
使用 Criteria 进行查询,主要要清晰的是 Hibernate 提供了那些类和方法来满足开发中查询条件的创建和组装。Criteria crit = session.createCriteria(User.class); crit.add(Restrictions.eq("name", "John")); List...
使用 Criteria 进行查询,主要要清晰的是 Hibernate 提供了那些类和方法来满足开发中查询条件的创建和组装。通过 Criteria,可以根据实际情况灵活地组装查询条件,以满足复杂的查询需求。 Hibernate 的 Criteria 是...
在Hibernate中,`Criteria`接口支持使用`Expression`类及其子类来实现模糊查询。例如,使用`like`表达式来进行模糊匹配: ```java Criteria criteria = session.createCriteria(User.class); criteria.add...
此外,Hibernate还支持Criteria查询,这是一种更加面向对象的查询方式,同样可以实现分页。 在"Struts+Hibernate分页及条件查询练习"这个项目中,开发者可能采用了以下步骤: 1. **配置Struts和Hibernate**:首先...
在Hibernate中,我们通常使用`Criteria`或`Query` API进行分页查询。`Criteria`提供了一种更面向对象的方式来执行SQL查询,而`Query` API则对应于原生的SQL语句。在这些API中,我们可以设置`setFirstResult()`和`...
Criteria 和 DetachedCriteria 都可以使用Criterion 和 Projection 设置查询条件,可以设置 FetchMode(联合查询抓取的模式)、设置排序方式,对于 Criteria 还可以设置 FlushMode(冲刷 Session 的方式)和 ...
与HQL(Hibernate Query Language)相比,Criteria API更易于理解和使用,尤其在处理复杂的查询条件时。它通过对象来表示查询条件,使得代码更具有可读性和可维护性。 ### 2. 创建Criteria查询 首先,我们需要从`...
Criteria用于在线查询,直接与Hibernate Session关联,而DetachedCriteria则可在不依赖Session的情况下创建,适用于离线或延迟执行的查询。DetachedCriteria可以通过`forClass(Class)`或`forEntityName(String)`静态...
关于数据库连接,Hibernate使用连接池来高效管理数据库连接。连接池在初始化时预创建一定数量的数据库连接,并在应用需要时分配,用完后归还,避免了频繁的连接创建和关闭带来的性能开销。Hibernate支持多种连接池...
除了Criteria查询,还可以使用HQL(Hibernate Query Language)进行分页查询,HQL是Hibernate提供的面向对象的查询语言,语法类似SQL。以下是一个使用HQL分页查询的例子: ```java String hql = "from User"; Query...
5. **分页**:通过`Criteria.setFirstResult()`和`Criteria.setMaxResults()`实现分页查询,前者指定从哪一条开始,后者指定最多返回多少条。 6. **投影**:Criteria查询不仅可以获取完整的对象,还可以进行投影...
Hibernate中的Criteria连表查询,包括单表属性查询,多表内连,以及左外连接查询
总结,Hibernate的分页查询是其强大功能的一部分,通过Criteria API、HQL或自定义SQL,我们可以轻松地在Java应用中实现数据库的分页操作。在实际开发中,应结合数据库特性和性能需求,选择最合适的分页策略。