`

Hibernate 的 Criteria用法,完整的一个例子

 
阅读更多

数据库:

/*
MySQL Data Transfer
Source Host: localhost
Source Database: test
Target Host: localhost
Target Database: test
Date: 2011-10-18 16:44:27
*/

SET FOREIGN_KEY_CHECKS=0;
-- ----------------------------
-- Table structure for table_a
-- ----------------------------
DROP TABLE IF EXISTS `table_a`;
CREATE TABLE `table_a` (
  `id` int(11) NOT NULL auto_increment,
  `name` varchar(20) default NULL,
  PRIMARY KEY  (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

-- ----------------------------
-- Table structure for table_b
-- ----------------------------
DROP TABLE IF EXISTS `table_b`;
CREATE TABLE `table_b` (
  `id` int(11) NOT NULL auto_increment,
  `name` varchar(20) default NULL,
  `aid` int(11) default NULL,
  PRIMARY KEY  (`id`),
  KEY `FK_aid_A_id` (`aid`),
  CONSTRAINT `FK_aid_A_id` FOREIGN KEY (`aid`) REFERENCES `table_a` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

-- ----------------------------
-- Table structure for table_c
-- ----------------------------
DROP TABLE IF EXISTS `table_c`;
CREATE TABLE `table_c` (
  `id` int(11) NOT NULL auto_increment,
  `name` varchar(20) default NULL,
  `bid` int(11) default NULL,
  PRIMARY KEY  (`id`),
  KEY `FK_bid_B_id` (`bid`),
  CONSTRAINT `FK_bid_B_id` FOREIGN KEY (`bid`) REFERENCES `table_b` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records 
-- ----------------------------
INSERT INTO `table_a` VALUES ('1', 'a_1');
INSERT INTO `table_a` VALUES ('2', 'a_2');
INSERT INTO `table_a` VALUES ('3', 'a_3');
INSERT INTO `table_a` VALUES ('4', 'a_4');
INSERT INTO `table_a` VALUES ('5', 'a_5');
INSERT INTO `table_a` VALUES ('6', 'a_6');
INSERT INTO `table_a` VALUES ('7', 'a_7');
INSERT INTO `table_a` VALUES ('8', 'a_8');
INSERT INTO `table_a` VALUES ('9', 'a_9');
INSERT INTO `table_a` VALUES ('10', 'a_10');
INSERT INTO `table_b` VALUES ('1', 'b_1', '1');
INSERT INTO `table_b` VALUES ('2', 'b_2', '1');
INSERT INTO `table_b` VALUES ('3', 'b_3', '1');
INSERT INTO `table_b` VALUES ('4', 'b_4', '1');
INSERT INTO `table_b` VALUES ('5', 'b_5', '1');
INSERT INTO `table_b` VALUES ('6', 'b_6', '1');
INSERT INTO `table_b` VALUES ('7', 'b_7', '1');
INSERT INTO `table_b` VALUES ('8', 'b_8', '1');
INSERT INTO `table_b` VALUES ('9', 'b_9', '1');
INSERT INTO `table_b` VALUES ('10', 'b_10', '1');
INSERT INTO `table_c` VALUES ('1', 'c_1', '1');
INSERT INTO `table_c` VALUES ('2', 'c_2', '1');
INSERT INTO `table_c` VALUES ('3', 'c_3', '1');
INSERT INTO `table_c` VALUES ('4', 'c_4', '1');
INSERT INTO `table_c` VALUES ('5', 'c_5', '1');
INSERT INTO `table_c` VALUES ('6', 'c_6', '1');
INSERT INTO `table_c` VALUES ('7', 'c_7', '1');
INSERT INTO `table_c` VALUES ('8', 'c_8', '1');
INSERT INTO `table_c` VALUES ('9', 'c_9', '1');
INSERT INTO `table_c` VALUES ('10', 'c_10', '1');
 

表映射的3个类

package com.hibernate.entity;

import java.util.HashSet;

/**
 * TableA entity. @author MyEclipse Persistence Tools
 */
@Entity
@Table(name = "table_a", catalog = "test")
public class TableA implements java.io.Serializable {

	// Fields

	/**
	 * 
	 */
	private static final long serialVersionUID = 5391348233326253804L;
	private Integer id;
	private String name;
	private Set<TableB> tableBs = new HashSet<TableB>(0);

	// Constructors

	/** default constructor */
	public TableA() {
	}

	/** full constructor */
	public TableA(String name, Set<TableB> tableBs) {
		this.name = name;
		this.tableBs = tableBs;
	}

	// Property accessors
	@Id
	@GeneratedValue
	@Column(name = "id", unique = true, nullable = false)
	public Integer getId() {
		return this.id;
	}

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

	@Column(name = "name", length = 20)
	public String getName() {
		return this.name;
	}

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

	@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "tableA")
	public Set<TableB> getTableBs() {
		return this.tableBs;
	}

	public void setTableBs(Set<TableB> tableBs) {
		this.tableBs = tableBs;
	}

}


package com.hibernate.entity;

import java.util.HashSet;

/**
 * TableB entity. @author MyEclipse Persistence Tools
 */
@Entity
@Table(name = "table_b", catalog = "test")
public class TableB implements java.io.Serializable {

	// Fields

	/**
	 * 
	 */
	private static final long serialVersionUID = -4305123492413110511L;
	private Integer id;
	private TableA tableA;
	private String name;
	private Set<TableC> tableCs = new HashSet<TableC>(0);

	// Constructors

	/** default constructor */
	public TableB() {
	}

	/** full constructor */
	public TableB(TableA tableA, String name, Set<TableC> tableCs) {
		this.tableA = tableA;
		this.name = name;
		this.tableCs = tableCs;
	}

	// Property accessors
	@Id
	@GeneratedValue
	@Column(name = "id", unique = true, nullable = false)
	public Integer getId() {
		return this.id;
	}

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

	@ManyToOne(fetch = FetchType.LAZY)
	@JoinColumn(name = "aid")
	public TableA getTableA() {
		return this.tableA;
	}

	public void setTableA(TableA tableA) {
		this.tableA = tableA;
	}

	@Column(name = "name", length = 20)
	public String getName() {
		return this.name;
	}

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

	@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "tableB")
	public Set<TableC> getTableCs() {
		return this.tableCs;
	}

	public void setTableCs(Set<TableC> tableCs) {
		this.tableCs = tableCs;
	}

}

package com.hibernate.entity;

import javax.persistence.Column;

/**
 * TableC entity. @author MyEclipse Persistence Tools
 */
@Entity
@Table(name = "table_c", catalog = "test")
public class TableC implements java.io.Serializable {

	// Fields

	/**
	 * 
	 */
	private static final long serialVersionUID = -8806809289431187808L;
	private Integer id;
	private TableB tableB;
	private String name;

	// Constructors

	/** default constructor */
	public TableC() {
	}

	/** full constructor */
	public TableC(TableB tableB, String name) {
		this.tableB = tableB;
		this.name = name;
	}

	// Property accessors
	@Id
	@GeneratedValue
	@Column(name = "id", unique = true, nullable = false)
	public Integer getId() {
		return this.id;
	}

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

	@ManyToOne(fetch = FetchType.LAZY)
	@JoinColumn(name = "bid")
	public TableB getTableB() {
		return this.tableB;
	}

	public void setTableB(TableB tableB) {
		this.tableB = tableB;
	}

	@Column(name = "name", length = 20)
	public String getName() {
		return this.name;
	}

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

}
 

Hibernate.cfg.xml

<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
          "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
          "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">

<!-- Generated by MyEclipse Hibernate Tools.                   -->
<hibernate-configuration>

	<session-factory>
		<property name="dialect">
			org.hibernate.dialect.MySQLDialect
		</property>
		<property name="connection.url">
			jdbc:mysql://localhost/test
		</property>
		<property name="connection.username">root</property>
		<property name="connection.password">root</property>
		<property name="connection.driver_class">
			com.mysql.jdbc.Driver
		</property>

		<!-- JDBC connection pool (use the built-in) -->
		<property name="connection.pool_size">1</property>



		<!-- Enable Hibernate's automatic session context management -->
		<property name="current_session_context_class">thread</property>

		<!-- Disable the second-level cache  -->
		<property name="cache.provider_class">
			org.hibernate.cache.NoCacheProvider
		</property>

		<!-- Echo all executed SQL to stdout -->
		<property name="show_sql">true</property>

		<property name="format_sql">true</property>
		<!--
			<mapping class="com.hibernate.entity.Husband" />
			<mapping class="com.hibernate.entity.Wife" />
			===================================================
			<mapping class="com.hibernate.entity.Teacher" />
			<mapping class="com.hibernate.entity.Student" />
                        <mapping class="com.hibernate.entity.Tgroup" />
		        <mapping class="com.hibernate.entity.Tuser" />
		-->

		
		<mapping class="com.hibernate.entity.TableC" />
		<mapping class="com.hibernate.entity.TableB" />
		<mapping class="com.hibernate.entity.TableA" />
	</session-factory>

</hibernate-configuration>
 

log4j.properties

### set log levels ###
log4j.rootLogger=warn, stdout, D, E


### 输出到控制台 ###
log4j.appender.stdout = org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target = System.out
log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern = %d{ABSOLUTE} %5p %c:%L - %m%n


### 输出到日志文件 ###
log4j.appender.D = org.apache.log4j.DailyRollingFileAppender
log4j.appender.D.File = ${WORKDIR}/logs/log.log
log4j.appender.D.Append = true
## 输出DEBUG级别以上的日志
log4j.appender.D.Threshold = DEBUG
log4j.appender.D.layout = org.apache.log4j.PatternLayout
log4j.appender.D.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [%t:%r] - %c:%L - [%p] %m%n


### 保存异常信息到单独文件 ###
log4j.appender.E = org.apache.log4j.DailyRollingFileAppender
## 异常日志文件名
log4j.appender.E.File = ${WORKDIR}/logs/error.log
log4j.appender.E.Append = true
## 只输出ERROR级别以上的日志!!!
log4j.appender.E.Threshold = ERROR 
log4j.appender.E.layout = org.apache.log4j.PatternLayout
log4j.appender.E.layout.ConversionPattern =%-d{yyyy-MM-dd HH\:mm\:ss} [%t\:%r] - %c\:%L - [%p] %m%n
 

测试代码:

 

package com.hibernate.test;


import java.util.HashMap;

public class ORMappingTest {
	
	private static SessionFactory sessionFactory;

	@BeforeClass
	public static void setUpBeforeClass() throws Exception {
		//new SchemaExport(new AnnotationConfiguration().configure()).create(true, true);
		sessionFactory = new AnnotationConfiguration().configure().buildSessionFactory();
	}

	@AfterClass
	public static void tearDownAfterClass() throws Exception {
		sessionFactory.close();
	}
	
        //根据annotation生成表,当然,这里并不使用到
	@Test
	public void testSchemaExport() {
		new SchemaExport(new AnnotationConfiguration().configure()).create(true, true);
	}
	
	//把值存入A B C三张表
	@Test
	public void saveABC() {
		Session s = sessionFactory.getCurrentSession();
		s.beginTransaction();
		TableA a = null;
		for (int i = 0; i < 10; i++) {
			a = new TableA();
			a.setName("a_" + (i + 1));
			s.save(a);
		}
		a = (TableA)s.get(TableA.class, 1);
		TableB b = null;
		for (int i = 0; i < 10; i++) {
			b = new TableB();
			b.setName("b_" + (i + 1));
			b.setTableA(a);
			s.save(b);
		}
		TableC c = null;
		b = (TableB)s.get(TableB.class, 1);
		for (int i = 0; i < 10; i++) {
			c = new TableC();
			c.setName("c_" + (i + 1));
			c.setTableB(b);
			s.save(c);
		}
		s.getTransaction().commit();
	}
	
	@Test
	public void testQBC() {
		Session s = sessionFactory.getCurrentSession();
		s.beginTransaction();
		Integer []id_s = {1,2,3,4}; 
		Criteria c = s.createCriteria(TableA.class)// 这里相当于 from TableA
		.add(Restrictions.in("id", id_s)) //这里取id在1,2,3,4中的TableA
		.createCriteria("tableBs") //表示把tableBs加进去再作为一个查询条件,tableBs是A对象中的一个属性
		.add(Restrictions.between("id", 5, 8))
		; 
		List<TableA> taList = c.list();
		for (TableA a : taList) {
			System.out.println(a.getName());
		}
	}

}
 

 

 

 

 

 

分享到:
评论

相关推荐

    Hibernate中Criteria的完整用法

    QBE是Criteria API的一个简单用法,通过一个实体对象作为模板来匹配数据库中的记录。例如,在`Student`类的上下文中,如果有一个名为`s`的学生对象,其`giftortoy`字段被设置为"2",那么调用`cri.add(Example....

    Hibernate Criteria用法大全.docx

    【Hibernate Criteria 用法详解】 Hibernate Criteria API 是一种面向对象的查询方式,它提供了一种比HQL(Hibernate Query Language)更为简洁且直观的查询手段。通过Criteria API,开发者可以构建复杂的查询条件...

    使用Hibernate的一个完整例子

    **使用Hibernate的一个完整例子** Hibernate 是一个开源的对象关系映射(ORM)框架,它简化了Java应用程序对数据库的操作。在本教程中,我们将探讨如何在实际项目中使用Hibernate进行数据库操作,通过一个完整的...

    Hibernate 的第一个例子

    这个简单的例子展示了如何使用Hibernate保存一个新用户到数据库。进一步学习时,你可以尝试查询、更新和删除操作,以及更复杂的查询表达式。 **总结** 通过这个"Hibernate的第一个例子",我们了解了如何配置...

    SpringMVC+Hibernate 的一个增删改例子

    SpringMVC是Spring框架的一部分,专门处理Web应用程序的请求-响应流程,而Hibernate则是一个强大的对象关系映射(ORM)工具,它简化了数据库操作。 **SpringMVC框架** SpringMVC是模型-视图-控制器(MVC)设计模式...

    一个很简单的hibernate例子

    在Java开发领域,Hibernate是一个非常重要的对象关系映射(ORM)框架,它简化了数据库与Java对象之间的交互。本示例将深入解析一个基于Hibernate的简单应用,帮助开发者理解其基本概念和工作流程。 首先,我们需要...

    Hibernate Criteria

    创建一个实体对象并设置属性,然后使用`Example.create()`方法创建Example对象,添加到Criteria中: ```java TUser user = new TUser(); user.setName("hulei"); user.setPassword("hulei"); Criteria ct = session...

    hibernate登录小例子

    【hibernate登录小例子】是一个面向初学者的教程,主要展示了如何利用Hibernate框架实现一个简单的用户登录功能。在这个例子中,我们将深入探讨Hibernate的基本概念、配置、实体类的创建、映射文件的编写以及Session...

    Hibernate的一个例子

    本篇文章将通过一个实际的例子,详细介绍如何使用Hibernate进行数据操作。 【描述】: 这篇博客主要介绍了如何利用Hibernate进行数据库操作,提供了具体步骤和代码示例。作者Clarancepeng在ITEYE上分享了这个实例...

    hibernate做的一个图书系统例子

    本文将以“hibernate做的一个图书系统例子”为主题,深入解析如何使用Hibernate构建一个完整的图书管理系统。 一、Hibernate简介 Hibernate是一个开源的Java库,它允许开发者用面向对象的方式来操作数据库,从而...

    Hibernate的使用例子代码

    在"Hibernate的使用例子代码"中,我们可以看到一个基础的示例,它将引导我们了解如何配置和使用Hibernate。下面将详细解释这个过程: 1. **配置Hibernate**: 使用Hibernate 首先需要在项目中引入Hibernate的依赖库...

    Hibernate的一个简单例子

    **Hibernate 是一个强大的Java持久化框架,用于简化数据库操作。在这个简单的例子中,我们将深入探讨Hibernate的核心概念,并了解如何在实际项目中应用它。** **一、Hibernate 概述** Hibernate 是一个对象关系映射...

    hibernate框架相关的例子

    - **保存(Save)**: 使用`Session.save()`方法将临时对象转变为持久化对象,生成一个新的数据库记录。 - **更新(Update)**: 如果对象已经是持久化状态,修改对象后调用`Session.update()`会更新数据库中的记录。 ...

    hibernate一对多项目

    - 查询数据时,可以使用Session的`load()`或`get()`方法获取实体,也可以使用HQL(Hibernate Query Language)或Criteria API进行复杂查询。 4. **级联操作**: - Hibernate支持级联操作,如`CascadeType.ALL`,...

    Hibernate初之单表映射学习例子

    3. **实体类设计**:讲解如何创建一个Java类作为数据库表的映射,包括使用`@Entity`注解标记实体类,`@Id`注解定义主键,以及其他字段的注解如`@Column`。 4. **XML映射文件**:解释Hibernate的Hibernate ...

    hibernate说明及demo的例子

    在“hibernate说明及demo的例子”压缩包中,应该包含了一个完整的示例项目,涵盖了上述所有知识点。这个示例将演示如何配置Hibernate、创建实体类、执行CRUD操作以及使用查询语言。通过运行此示例,你可以更好地理解...

    hibernate的一个简单的例子

    Hibernate 是一个开源的对象关系映射(ORM)框架,它允许开发者将Java对象与数据库中的表进行映射,简化了数据库操作。通过使用Hibernate,开发者可以避免编写大量的SQL语句,提高开发效率,同时也使得代码更加可读...

    hibernate入门小例子

    【hibernate入门小例子】是一个适合初学者的教程,主要涵盖了如何在JavaWeb项目中使用Hibernate框架与MySQL数据库进行集成。在这个例子中,我们将会深入理解Hibernate的核心概念,包括实体映射、对象关系映射(ORM)...

    hibernate和spring的几个小例子

    Spring还包含了诸如数据访问、Web服务、安全控制等多个模块,形成了一个完整的应用开发生态。在Spring中,我们可以通过配置XML或者使用Java配置来实现DI,让Spring容器管理对象的生命周期和依赖关系。 结合...

Global site tag (gtag.js) - Google Analytics