`

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集合对象采用查询方式抓取
用这种方式取出的才是正确的数据
分享到:
评论

相关推荐

    Hibernate 多表连接分页查询示范项目

    总结,"Hibernate 多表连接分页查询示范项目"是一个实用的示例,它展示了如何在实际应用中利用 Hibernate Criteria API 实现复杂查询和分页,对于学习和掌握 Hibernate 的高级特性和数据库操作技巧非常有帮助。...

    Hibernate-Criteria_模糊查询

    在深入探讨Hibernate与Criteria结合进行模糊查询之前,我们先来了解一下Hibernate和Criteria的基本概念,以及为何选择使用它们进行模糊查询。 ### Hibernate简介 Hibernate是一个开放源代码的对象关系映射(ORM)...

    hibernate 模糊查询 分页

    本篇文章将深入探讨如何使用Hibernate实现模糊查询和分页功能,这对于任何需要处理大量数据的应用程序来说都是至关重要的技能。 首先,让我们了解Hibernate的核心概念。Hibernate是一个开源的JPA(Java Persistence...

    hibernate如何使用criteria联合查询 group by 的语句

    这个案例是根据分组查询,并且得到每组的条数,不懂得可以q我:1710086675,欢迎认识更多新朋友

    hibernateCriteria查询

    ### Hibernate Criteria 查询详解 #### 一、概述 Hibernate Criteria 查询是一种强大的对象化查询方式,它为开发者提供了一种灵活而直观的方式来构建复杂的查询逻辑。与传统的SQL查询相比,Criteria查询更加面向...

    Hibernate的Criteria用法总结.doc

    使用 Criteria 进行查询,主要要清晰的是 Hibernate 提供了那些类和方法来满足开发中查询条件的创建和组装。Criteria crit = session.createCriteria(User.class); crit.add(Restrictions.eq("name", "John")); List...

    Hibernate中Criteria的完整用法

    使用 Criteria 进行查询,主要要清晰的是 Hibernate 提供了那些类和方法来满足开发中查询条件的创建和组装。通过 Criteria,可以根据实际情况灵活地组装查询条件,以满足复杂的查询需求。 Hibernate 的 Criteria 是...

    Hibernate-Criteria 模糊查询

    在Hibernate中,`Criteria`接口支持使用`Expression`类及其子类来实现模糊查询。例如,使用`like`表达式来进行模糊匹配: ```java Criteria criteria = session.createCriteria(User.class); criteria.add...

    Struts和Hibernate分页及查询

    此外,Hibernate还支持Criteria查询,这是一种更加面向对象的查询方式,同样可以实现分页。 在"Struts+Hibernate分页及条件查询练习"这个项目中,开发者可能采用了以下步骤: 1. **配置Struts和Hibernate**:首先...

    使用hibernate分页查询

    在Hibernate中,我们通常使用`Criteria`或`Query` API进行分页查询。`Criteria`提供了一种更面向对象的方式来执行SQL查询,而`Query` API则对应于原生的SQL语句。在这些API中,我们可以设置`setFirstResult()`和`...

    Hibernate中Criteria的使用

    Criteria 和 DetachedCriteria 都可以使用Criterion 和 Projection 设置查询条件,可以设置 FetchMode(联合查询抓取的模式)、设置排序方式,对于 Criteria 还可以设置 FlushMode(冲刷 Session 的方式)和 ...

    关联映射hibernate的criteria的用法

    与HQL(Hibernate Query Language)相比,Criteria API更易于理解和使用,尤其在处理复杂的查询条件时。它通过对象来表示查询条件,使得代码更具有可读性和可维护性。 ### 2. 创建Criteria查询 首先,我们需要从`...

    Hibernate的Criteria用法总结

    Criteria用于在线查询,直接与Hibernate Session关联,而DetachedCriteria则可在不依赖Session的情况下创建,适用于离线或延迟执行的查询。DetachedCriteria可以通过`forClass(Class)`或`forEntityName(String)`静态...

    hibernate分页查询 数据库连接

    关于数据库连接,Hibernate使用连接池来高效管理数据库连接。连接池在初始化时预创建一定数量的数据库连接,并在应用需要时分配,用完后归还,避免了频繁的连接创建和关闭带来的性能开销。Hibernate支持多种连接池...

    Hibernate中分页查询的封装。

    除了Criteria查询,还可以使用HQL(Hibernate Query Language)进行分页查询,HQL是Hibernate提供的面向对象的查询语言,语法类似SQL。以下是一个使用HQL分页查询的例子: ```java String hql = "from User"; Query...

    Hibernate_Criteria条件查询数据

    5. **分页**:通过`Criteria.setFirstResult()`和`Criteria.setMaxResults()`实现分页查询,前者指定从哪一条开始,后者指定最多返回多少条。 6. **投影**:Criteria查询不仅可以获取完整的对象,还可以进行投影...

    Criteria连表查询

    Hibernate中的Criteria连表查询,包括单表属性查询,多表内连,以及左外连接查询

    hibernate分页查询

    总结,Hibernate的分页查询是其强大功能的一部分,通过Criteria API、HQL或自定义SQL,我们可以轻松地在Java应用中实现数据库的分页操作。在实际开发中,应结合数据库特性和性能需求,选择最合适的分页策略。

Global site tag (gtag.js) - Google Analytics