在设计用户安全管理时,表User和Role是多对多,Role和Recoucs是多对多。但是查询时遇到重复记录的问题,为此参考了下面的例子。
原文地址:
http://blog.csdn.net/abcjack145/archive/2009/12/15/5012630.aspx
//得到所有不重复记录
public long countLinkList(Link link, int networkId,
Integer[] keywordGroupIds, String countryCode,
Integer[] domainGroupIds) {
Criteria criteria = getSession().createCriteria(Link.class);
criteria.addOrder(Order.asc("linkId"));
if (link != null && link.getLinkCode().length() > 0) {
criteria.add(Restrictions.like("linkCode", link.getLinkCode(),MatchMode.ANYWHERE));
}
if (link != null && link.getDescription() != null
&& link.getDescription().length() > 0) {
criteria.add(Restrictions.like("description",
link.getDescription(), MatchMode.ANYWHERE));
}
if (link != null && link.getTitle() != null
&& link.getTitle().length() > 0) {
criteria.add(Restrictions.like("title", link.getTitle(),
MatchMode.ANYWHERE));
}
if (networkId > 0) {
criteria.createCriteria("network").setFetchMode("network",
FetchMode.JOIN)
.add(Restrictions.eq("networkId", networkId));
}
if (countryCode != null && !countryCode.equals("")) {
criteria.createCriteria("countries").setFetchMode("countries",
FetchMode.JOIN).add(
Restrictions.like("countryCode", countryCode,
MatchMode.EXACT));
}
if (domainGroupIds != null && domainGroupIds.length > 0) {
criteria.createCriteria("domainGroups").setFetchMode(
"domainGroups", FetchMode.JOIN).add(
Restrictions.in("domainGroupId", domainGroupIds));
}
if (keywordGroupIds != null && keywordGroupIds.length > 0) {
criteria.createCriteria("keywordGroups").setFetchMode(
"keywordGroups", FetchMode.JOIN).add(
Restrictions.in("keywordGroupId", keywordGroupIds));
}
criteria.setProjection(Projections.countDistinct("linkId")).uniqueResult();
return (long)((Integer)criteria.list().get(0)).intValue();
}
//得到所有不重复记录
public List<Link> findLinkList(Link link, int networkId,
Integer[] keywordGroupIds, String countryCode,
Integer[] domainGroupIds, int page, int offset) {
Criteria criteria = getSession().createCriteria(Link.class);
criteria.addOrder(Order.asc("linkId"));
if (link != null && link.getLinkCode().length() > 0) {
criteria.add(Restrictions.like("linkCode", link.getLinkCode(),MatchMode.ANYWHERE));
}
if (link != null && link.getDescription() != null
&& link.getDescription().length() > 0) {
criteria.add(Restrictions.like("description",
link.getDescription(), MatchMode.ANYWHERE));
}
if (link != null && link.getTitle() != null
&& link.getTitle().length() > 0) {
criteria.add(Restrictions.like("title", link.getTitle(),
MatchMode.ANYWHERE));
}
if (networkId > 0) {
criteria.createCriteria("network").setFetchMode("network",
FetchMode.JOIN)
.add(Restrictions.eq("networkId", networkId));
}
if (countryCode != null && !countryCode.equals("")) {
criteria.createCriteria("countries").setFetchMode("countries",
FetchMode.JOIN).add(
Restrictions.like("countryCode", countryCode,
MatchMode.EXACT));
}
if (domainGroupIds != null && domainGroupIds.length > 0) {
criteria.createCriteria("domainGroups").setFetchMode(
"domainGroups", FetchMode.JOIN).add(
Restrictions.in("domainGroupId", domainGroupIds));
}
if (keywordGroupIds != null && keywordGroupIds.length > 0) {
criteria.createCriteria("keywordGroups").setFetchMode(
"keywordGroups", FetchMode.JOIN).add(
Restrictions.in("keywordGroupId", keywordGroupIds));
}
criteria = criteria.setFirstResult(page * offset);
criteria = criteria.setMaxResults(offset);
List result = null;
try {
result = criteria.setResultTransformer(
CriteriaSpecification.DISTINCT_ROOT_ENTITY).list();
} catch (Exception e) {
e.printStackTrace();
}
return result;
}
附注FetchMode详解:
FetchMode.JOIN 使用left join查询 只产生一条sql语句
FetchMode.SELECT 产生N+1条sql语句
FetchMode.SUBSELECT 产生两条sql语句 第二条语句使用id in (.....)查询出所有关联的数据
分享到:
相关推荐
在Hibernate中,处理多对多关系需要定义两个实体类,每个实体类对应一个表,并在其中一个或两个实体类中声明`@ManyToMany`注解。这个注解用于表示两个实体之间的多对多关联。例如,我们有`Student`和`Course`两个类...
多表联合查询是指在一个查询语句中同时从两个或两个以上的表中获取数据。在关系型数据库中,这种查询非常常见,尤其是在需要从不同表中获取关联数据的情况下。 在Hibernate中,可以使用以下几种方式来实现多表联合...
本示例主要关注的是Hibernate中的多对多关联映射及其添加与查询方法。 多对多关联是数据库设计中的一种常见关系类型,指的是两个实体之间可以存在多个对应关系。例如,在学生与课程的关系中,一个学生可以选修多门...
在Java的持久化框架Hibernate中,多对多关联映射是一种常见的关系数据库模型映射方式,用于处理两个实体之间存在多个实例互相关联的情况。本文将深入探讨Hibernate如何实现多对多关联映射,并通过实际例子解析相关...
这个例子展示了如何使用Hibernate进行多对多映射的基本操作,通过理解和实践,你可以更好地掌握这种关系的映射技巧,从而在实际项目中灵活运用。记住,理解并正确配置中间表和`@ManyToMany`注解是关键。
**标题解析:**“hibernate的第一个例子”表明这是一个关于Hibernate框架的基础教程,主要目标是展示如何使用Hibernate进行数据持久化操作。 **描述分析:**描述提到这是一个超级简单的例子,包含一个持久化对象...
这个“hibernate+struts实现数据库查询的例子”是针对初学者的一个实践教程,旨在展示如何整合这两个框架来实现数据库的查询操作。下面将详细介绍这两个框架及其整合使用的方式。 `Hibernate`是Java平台上的一款...
- Hibernate_many_to_many_1:这表示多对多关联关系的示例,多对多关联是两个实体之间存在多个对应关系的情况,例如学生和课程之间的关系。 - Hibernate_1to1_two:这可能是另一个一对一关联的例子,可能展示了不同...
总结,"Hibernate 多表连接分页查询示范项目"是一个实用的示例,它展示了如何在实际应用中利用 Hibernate Criteria API 实现复杂查询和分页,对于学习和掌握 Hibernate 的高级特性和数据库操作技巧非常有帮助。...
在数据库设计中,多对多关系意味着两个表之间存在复杂的关系。例如,学生和课程的关系,一个学生可以选修多门课程,而一门课程也可以被多个学生选修。在关系型数据库中,通常通过创建第三个关联表来实现这种关系,该...
在这个例子中,`@ManyToOne`注解告诉Hibernate,`Student`类的`teacher`属性是一个多对一的关系,外键`teacher_id`存储在`Student`表中。 4. **持久化操作** - **保存**:当保存一个`Student`对象时,如果`...
在本文中,我们将深入探讨如何创建Hibernate的第一个例子,帮助初学者快速入门。** **一、Hibernate 简介** Hibernate 提供了丰富的API,简化了Java应用程序与关系数据库之间的交互。它通过XML配置文件或注解来定义...
根据提供的文件信息,我们可以深入探讨Hibernate中的连表查询方法及其应用。下面将详细介绍与标题、描述及部分代码相关的几个核心知识点: ### Hibernate 连表查询基础 Hibernate 是一个开源的对象关系映射(ORM)...
**标题:Hibernate经典例子全** **内容:** Hibernate是一款强大的Java持久化框架,它简化了数据库操作,使得开发者可以更加专注于业务逻辑而无需过多关注底层的SQL语句。本资源包含了一系列的Hibernate实例,旨在...
5. **操作关联**:在代码中,可以通过Hibernate的Session接口进行添加、删除、查询等操作,以维护多对多关系。 **数据库代码** 数据库代码部分可能包括创建相关表和中间表的SQL语句,以及填充数据的INSERT语句。...
以下是一个简单的例子,假设我们有`User`和`Role`两个实体,它们之间是多对多关系: 1. 定义`User`实体: ```java @Entity public class User { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) ...
在项目实践中,为了更好地理解这个例子,你可以打开`day56_01hibernate one2many`目录,查看具体代码,包括实体类、映射文件、DAO层、Service层以及相关的测试类。通过分析这些代码,你将能更好地掌握Hibernate一对...
Hibernate 是一个开源的O/R mappimg的框架,基于JDBC...另外还有两个东东,一个是class2hbm,与第一个相反,是根据class来导出映射文件的。还有一个ddl2hbm,是根据数据库来导出表结构,并生成映射文件和POJO class。
在Java的持久化框架Hibernate中,多对多(Many-to-Many)关系是数据库中常见的关联类型,它允许一个实体实例对应多个其他实体实例,反之亦然。在本项目"hibernate多对多的简单实现"中,我们看到的是学生(Student)...
hibernate 多表查询 hibernate 多表不同于一般的sql嵌套查询,嵌套查询是不支持的,所以必须要配置好才能实现多表!只要配置好了,还是特别好用的