`

Hibernate内存排序

 
阅读更多
内存排序
内存排序和数据库排序唯一的不同就是在配置文件中使用sort属性而不是order-by属性
他有三个属性值(unsorted,natural),其中natural指的是按照自然的升序排序,第三个
属性值是我们自己定义 的排序规则类,该规则类通过实现Comparator接口,并且实现
该接口中的Compare方法,在该方法中定义排序规则即可。然后将该自定义的排序规则
的类名作为sort的属性值即可.

具体参考:

Team.java

package com.fgh.hibernate;

import java.util.Set;

public class Team {

	private String id;

	private String teamName;

	private Set<Student> students;

	public String getId() {
		return id;
	}

	public void setId(String id) {
		this.id = id;
	}

	public String getTeamName() {
		return teamName;
	}

	public void setTeamName(String teamName) {
		this.teamName = teamName;
	}

	public Set<Student> getStudents() {
		return students;
	}

	public void setStudents(Set<Student> students) {
		this.students = students;
	}
}

Student.java

package com.fgh.hibernate;

/**
 * 一对一双向关联
 * 
 * @author fgh
 * 
 */
public class Student {

	private String id;

	private String name;

	private String idCard;

	private int age;

	private Team team;

	public Team getTeam() {
		return team;
	}

	public void setTeam(Team team) {
		this.team = team;
	}

	public String getId() {
		return id;
	}

	public void setId(String id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getIdCard() {
		return idCard;
	}

	public void setIdCard(String idCard) {
		this.idCard = idCard;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

}

Team.hbm.xml

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
	<class name="com.fgh.hibernate.Team" table="team">
		<id name="id" column="id" type="string">
			<generator class="uuid"></generator>
		</id>
		<property name="teamName" column="teamName" type="string"></property>

		<!-- 这里sort属性设置我们自己的排序规则 -->
		<set name="students" lazy="false" cascade="all" inverse="true"
			fetch="select" sort="com.fgh.hibernate.MyComparator">
			<key column="team_id"></key>
			<one-to-many class="com.fgh.hibernate.Student" />
		</set>
	</class>
</hibernate-mapping>

Student.hbm.xml

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
	<class name="com.fgh.hibernate.Student" table="student">
		<id name="id" column="id" type="string">
			<generator class="uuid"></generator>
			
		</id>
		<property name="name" column="name" type="string"></property>
		<property name="idCard" column="idcard" type="string"></property>
		<property name="age" column="age" type="integer"></property>
		<many-to-one name="team" class="com.fgh.hibernate.Team"
			column="team_id">
		</many-to-one>
	</class>

</hibernate-mapping>

自定义排序规则类:

MyComparator.java

package com.fgh.hibernate;

import java.util.Comparator;

/**
 * 自定义排序规则类
 * 
 * @author fgh
 *
 */
public class MyComparator implements Comparator<Student> {

	public int compare(Student s1, Student s2) {
		//如果两个对象相同,不排序
		if (s1 == s2) {
			return 0;
		}
		int result = s1.getIdCard().compareToIgnoreCase(s2.getIdCard());
		//如果cardId不同,按照cardId排序
		if (result != 0) {
			//如果降序 return -result;
			return result;
		}
		//如果cardId相同,按照name排序
		//如果降序 返回负值
		return s1.getName().compareToIgnoreCase(s2.getName());
	}

}

测试类:

HIbernateTest.java

package com.fgh.hibernate;

import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;

public class HibernateTest {

	private static SessionFactory sessionFactory;

	static {
		try {
			sessionFactory = new Configuration().configure()
					.buildSessionFactory();

		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	public static void main(String[] args) {

		// 先执行插入操作 有了数据才可以查询哦
		// ------------begin--------------
		Team team = new Team();
		team.setTeamName("team1");
		team.setStudents(new HashSet<Student>());

		Student student = new Student();
		student.setName("zhangsan");
		student.setIdCard("aa");
		student.setAge(20);

		Student student1 = new Student();
		student1.setName("lisi");
		student1.setIdCard("aa");
		student1.setAge(21);

		Student student2 = new Student();
		student2.setName("wangwu");
		student2.setIdCard("ba");
		student2.setAge(22);

		Student student3 = new Student();
		student3.setName("xiaoqiang");
		student3.setIdCard("bb");
		student3.setAge(23);

		Student student4 = new Student();
		student4.setName("xiaohong");
		student4.setIdCard("dc");
		student4.setAge(24);

		team.getStudents().add(student);
		team.getStudents().add(student1);
		team.getStudents().add(student2);
		team.getStudents().add(student3);
		team.getStudents().add(student4);

		student.setTeam(team);
		student1.setTeam(team);
		student2.setTeam(team);
		student3.setTeam(team);
		student4.setTeam(team);
		// -------------end------------
		Session session = sessionFactory.openSession();
		Transaction tx = null;

		try {
			tx = session.beginTransaction();
			// 查询----bein--------
			Team team2 = (Team) session.get(Team.class,
					"8a8ae4d934b2bfa10134b2bfa4a30001");

			Set<Student> set = team2.getStudents();

			for (Iterator<Student> iterator = set.iterator(); iterator
					.hasNext();) {
				System.out.println(iterator.next().getName());
			}
			// --------------end----------
			// 保存
			// session.save(team);

			tx.commit();

		} catch (Exception e) {
			e.printStackTrace();
			if (null != tx) {
				tx.rollback();
			}
		} finally {
			session.close();
		}
	}
}
打印sql:

Hibernate: select team0_.id as id1_0_, team0_.teamName as teamName1_0_ from team team0_ where team0_.id=?
Hibernate: select students0_.team_id as team5_1_, students0_.id as id1_, students0_.id as id0_0_, students0_.name as name0_0_, students0_.idcard as idcard0_0_, students0_.age as age0_0_, students0_.team_id as team5_0_0_ from student students0_ where students0_.team_id=?
lisi
zhangsan
wangwu
xiaoqiang
xiaohong

哦也,完成


分享到:
评论

相关推荐

    hibernate面试题2

    - **sorted collection**:在内存中通过Java比较器排序。 - **ordered collection**:在数据库层面通过`ORDER BY`进行排序。 5. **Hibernate在Spring和Struts中的应用**: - Hibernate简化了数据访问层的代码,...

    hibernate面试题大全

    - **SortedCollection**:在内存中通过Java的比较器进行排序,适用于需要在内存中实时排序的情况。 - **OrderedCollection**:在数据库中通过`ORDER BY`子句进行排序,适用于需要按特定顺序从数据库获取数据的情况。...

    hibernate bag 集合映射

    在Java代码中,你可以将bag映射为ArrayList或者LinkedList,尽管它们在内存中的实现不同,但Hibernate并不关心这个细节,它只负责保存和检索对象。 在描述中提到的“博文链接:...

    hibernate-search-4.3.0.zip

    4.3.0版本支持多种存储解决方案,包括内存、文件系统、数据库等。 四、API使用 1. **索引创建**:使用@EntityIndexBuilder或@EntityListeners注解来声明需要被索引的实体类。 2. **全文搜索**:通过FullTextQuery...

    hibernate-3.6.8-doc-zh

    1. 改进的性能:3.6.8版本优化了查询执行速度,降低了内存占用,提升了整体性能。 2. 强大的对象关系映射:支持复杂的数据结构,如集合、多对多关系、继承等。 3. 支持HQL(Hibernate Query Language):一种面向...

    Hibernate的MySql查询.rar

    除了这些基本查询,Hibernate还支持更复杂的操作,如分页查询、排序、联接查询等。例如,如果我们想按用户名降序分页查询用户,可以这样做: ```java Criteria criteria = session.createCriteria(User.class) ....

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

    例如,可以创建一个 Criteria 对象,然后添加各种限制条件、排序和分组,最后执行查询。对于多表连接,Criteria API 可以通过 JoinType 类型的 JOIN 方法实现,如 INNER JOIN、LEFT JOIN 等。 **分页查询** 在大...

    精通hibernate源码ch3

    对象持久化是将内存中的对象状态保存到持久存储介质(如数据库)的过程,使得这些数据即使在应用程序关闭后仍能保留。在Hibernate中,这个过程通过映射机制来实现,将Java对象与数据库表对应,使得对象的操作可以...

    hibernate面试题总结

    - **sorted collection**:在内存中使用Java比较器进行排序,排序发生在程序运行时。 - **ordered collection**:通过在数据库查询中使用`order by`子句进行排序,排序发生在数据库层面,结果直接按照指定顺序返回...

    hibernate-release-5.4.4.Final.zip

    同时,它还提升了批处理操作的效率,降低了内存占用,提升了大规模数据操作的性能。 其次,事务管理是任何持久化框架的关键部分。Hibernate 5.4.4.Final支持JTA(Java Transaction API)和JTASessionContext,提供...

    hibernate-search-5.0.1.Final-dis

    5. **功能**:主要功能包括对数据库字段的实时索引、支持模糊搜索、排序、分页,以及复杂的布尔查询和短语匹配。 6. **集成**:在Java项目中,开发者需要将提供的JAR文件添加到类路径,并进行相应的配置,以启用...

    Hibernate3.2.6源代码以及英文api

    7. **Query和Criteria API的使用**:通过`Session`对象的`createQuery()`或`createCriteria()`方法创建查询,然后设置参数、排序、分页等,最后调用`list()`、`uniqueResult()`等方法执行查询。 8. **事务管理**:...

    hibernate数据库相关操作步骤

    - `Criteria`查询提供了更面向对象的查询方式,可以方便地进行条件、排序和分页操作。 6. **事务管理** - Hibernate支持JTA(Java Transaction API)和JDBC事务管理。通常在业务逻辑层(Service层)处理事务,...

    hibernate search-3.4.0.Final-dist

    6. **排序和评分**:可以根据搜索结果的相关性进行排序,同时支持自定义的排序规则,如根据时间、地理位置等信息。 7. **分布式搜索**:在大型应用中,Hibernate Search支持分布式索引,可以在集群环境中高效地处理...

    hibernate-4.2.3

    - **查询优化**:使用JOIN、子查询、分页、排序等功能进行复杂查询,同时注意避免N+1查询问题。 5. **最佳实践与注意事项** - **事务管理**:合理使用Transaction接口,确保数据的一致性和完整性。 - **性能调优...

    hibernate数据库访问接口设计

    通过 `Criteria`,开发者可以灵活地指定查询条件、排序方式、分组等,使其更适应需求的变化。 ### 3. Query 和 HQL `Query` 接口用于执行HQL查询,HQL是一种面向对象的查询语言,类似于SQL,但它是针对Hibernate...

    Hibernate常见面试题

    HQL支持多种查询方式,如选择、排序等。 4. **QBC检索**:QBC(Query By Criteria)是一种基于标准的API进行条件查询的方式,它允许开发者构建复杂的查询逻辑。 5. **本地SQL检索**:直接使用SQL语句进行检索。这种...

    hibernate_src

    例如,使用 EhCache 或 Infinispan 作为二级缓存提供商,可以将频繁访问的数据存储在内存中。 6. 事务管理:Hibernate支持JTA和JDBC两种事务管理方式。在JTA模式下,事务由应用服务器控制;而在JDBC模式下,开发...

    hibernate search4.2

    7. **排序和评分**:根据相关性对搜索结果进行排序,提供更准确的搜索体验。 8. **近实时搜索**:索引更新与搜索之间的时间延迟极小,接近实时。 ### 安装与配置 在项目中使用 Hibernate Search 4.2 需要将对应的 ...

Global site tag (gtag.js) - Google Analytics