Hibernate---Hql查询2---

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://127.0.0.1/java?characterEncoding=utf-8
	</property>
	<property name="connection.username">root</property>
	<property name="connection.password">root</property>
	<property name="connection.driver_class">
		com.mysql.jdbc.Driver
	</property>
	<property name="myeclipse.connection.profile">
		com.mysql.jdbc.Driver
	</property>
	<property name="show_sql">true</property>
	<property name="format_sql">true</property>
	<mapping resource="com/etc/entity/Person.hbm.xml" />
	<mapping resource="com/etc/entity/Sex.hbm.xml" />
</session-factory>
</hibernate-configuration>
=============================================
2个实体:

package com.etc.entity;

/**
 * Person entity. @author MyEclipse Persistence Tools
 */

public class Person implements java.io.Serializable {

	// Fields

	private Integer pid;
	private Sex sex;  //n端持有1端的1个关联对象
	private String pname;

	// Constructors

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

	/** full constructor */
	public Person(Sex sex, String pname) {
		this.sex = sex;
		this.pname = pname;
	}

	// Property accessors

	public Integer getPid() {
		return this.pid;
	}

	public void setPid(Integer pid) {
		this.pid = pid;
	}

	public Sex getSex() {
		return this.sex;
	}

	public void setSex(Sex sex) {
		this.sex = sex;
	}

	public String getPname() {
		return this.pname;
	}

	public void setPname(String pname) {
		this.pname = pname;
	}

	@Override
	public String toString() {
		return "Person [pid=" + pid + ", pname=" + pname + ", sex=" + sex.getSexname() + "]";
	}

}

===============
package com.etc.entity;

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

/**
 * Sex entity. @author MyEclipse Persistence Tools
 */

public class Sex implements java.io.Serializable {

	// Fields

	private Integer sexid;
	private String sexname;
	private Set persons = new HashSet(0); //1 端持有N端的1个集合对象

	// Constructors

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

	@Override
	public String toString() {
		return "Sex [persons的数量:" + persons.size() + ", sexid=" + sexid + ", sexname="
				+ sexname + "]";
	}

	/** minimal constructor */
	public Sex(String sexname) {
		this.sexname = sexname;
	}

	/** full constructor */
	public Sex(String sexname, Set persons) {
		this.sexname = sexname;
		this.persons = persons;
	}

	// Property accessors

	public Integer getSexid() {
		return this.sexid;
	}

	public void setSexid(Integer sexid) {
		this.sexid = sexid;
	}

	public String getSexname() {
		return this.sexname;
	}

	public void setSexname(String sexname) {
		this.sexname = sexname;
	}

	public Set getPersons() {
		return this.persons;
	}

	public void setPersons(Set persons) {
		this.persons = persons;
	}

}
=============
Person.hbm.xml配置:

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!--
    Mapping file autogenerated by MyEclipse Persistence Tools
-->
<hibernate-mapping>
    <class name="com.etc.entity.Person" table="person" catalog="java" lazy="true">
        <id name="pid" type="java.lang.Integer">
            <column name="pid" />
            <generator class="identity" />
        </id>
        <many-to-one name="sex" class="com.etc.entity.Sex" lazy="false" cascade="save-update">
            <column name="sexid" not-null="true"/>
        </many-to-one>
        <property name="pname" type="java.lang.String">
            <column name="pname" length="20" not-null="true" />
        </property>
    </class>
    <query name="find_unusual_sex">
    	from Person where sex.sexname not in(‘男性‘,‘女性 ‘)
    </query>
    <sql-query name="find_max_count_sex">
    select t1.*,sex.sexname from
   	(select count(1) 人口,sexid from person group by sexid) t1,sex
   	where t1.人口
   	=
   	(select max(人口) from
    	(select count(1) 人口,sexid from person group by sexid) t2
    )
    and t1.sexid = sex.sexid;
    </sql-query>
</hibernate-mapping>
============================
Sex.hbm.xml配置:

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!--
    Mapping file autogenerated by MyEclipse Persistence Tools
-->
<hibernate-mapping>
    <class name="com.etc.entity.Sex" table="sex" catalog="java">
        <id name="sexid" type="java.lang.Integer">
            <column name="sexid" />
            <generator class="identity" />
        </id>
        <property name="sexname" type="java.lang.String">
            <column name="sexname" length="20" not-null="true" unique="true" />
        </property>
        <set name="persons" inverse="true" lazy="false" outer-join="false" cascade="">
            <key>
                <column name="sexid" not-null="true" />
            </key>
            <one-to-many class="com.etc.entity.Person" />
        </set>
    </class>
</hibernate-mapping>
==========================
测试类:hql查询.java

package com.etc.test;
import java.util.List;
import java.util.Properties;
import org.hibernate.Query;
import org.hibernate.SQLQuery;
import org.hibernate.Session;
import com.etc.dao.HibernateSessionFactory;
import com.etc.entity.Person;
import com.etc.entity.Sex;
public class hql查询 {
	static void 完整对象的查询()
	{
		//1 获取连接
		Session s = HibernateSessionFactory.getSession();
		//2 构造hql语句
		String hql = "from Person where pname like ‘老%‘";
		//3 执行查询
		List<Person> list = s.createQuery(hql).list();
		//4 遍历结果
		for(Person p:list)
		{
			System.out.println(p);
		}
		//5 关闭连接
		HibernateSessionFactory.closeSession();
	}
	static void 部分字段的查询()
	{
		//1 获取连接
		Session s = HibernateSessionFactory.getSession();
		//2 构造hql语句。只返回部分字段
		String hql = "select pid,pname from Person where pname like ‘老%‘";
		//3 执行查询
		List<Object[]> list = s.createQuery(hql).list();
		//4 遍历
		for(Object[] fields:list)
		{
			//把每条记录的字段显示查询
			for(Object field:fields)
			{
				System.out.print(field+"\t");
			}
			System.out.println();
		}
		//5 关闭连接
		HibernateSessionFactory.closeSession();

	}
	static void 关联条件查询()
	{
		//1 获取连接
		Session s = HibernateSessionFactory.getSession();
		//a 显式关联(inner join关键字)
		//2 构造hql语句
		String hql = "from Person as p inner join p.sex  as s " +
				"where s.sexname like ‘男%‘";
		//3 执行查询.获得主对象和关联对象
		List<Object[]> list = s.createQuery(hql).list();
		//4 遍历结果
		for(int i=0;i<list.size();i++)
		{
			Person p = (Person) list.get(i)[0];
			System.out.println(p);
		}
		//b 隐式关联.推荐使用
		/*2 构造hql语句。使用关联对象的属性作为约束条件。
		String hql = "from Person where sex.sexname like ‘女%‘";
		//3 执行查询
		List<Person> list = s.createQuery(hql).list();
		//4 遍历结果
		for(Person p:list)
		{
			System.out.println(p);
		}
		*/
		//5 关闭连接
		HibernateSessionFactory.closeSession();
	}
	static void 聚合查询()
	{
		//1 获取连接
		Session s = HibernateSessionFactory.getSession();
		//2 构造hql语句
		/*
		String hql = "select ‘记录的总数:‘||cast(count(pid),string) from Person";
		List<Object> list = s.createQuery(hql).list();
		System.out.println(list.get(0));
		*/
		//分组查询,统计各个性别的人数
		String hql = "select ‘人数:‘||cast(count(pid),string),‘性别名:‘||sex.sexname from Person " +
				"group by sex";
		List<Object[]> list = s.createQuery(hql).list();
		for(Object[] fields:list)
		{
			//把每条记录的字段显示查询
			for(Object field:fields)
			{
				System.out.print(field+"\t");
			}
			System.out.println();
		}
		//5 关闭连接
		HibernateSessionFactory.closeSession();
	}
	static void 分页查询()
	{
		//1 获取连接
		Session s = HibernateSessionFactory.getSession();
		//2 构造hql语句
		String hql = "from Person where pname like ‘老%‘";
		//3 执行查询.第3到6条记录
		Query q = s.createQuery(hql);
		q.setFirstResult(2);//设置起点
		q.setMaxResults(4);//设置条数
		List<Person> list = q.list();
		//4 遍历结果
		for(Person p:list)
		{
			System.out.println(p);
		}
		//5 关闭连接
		HibernateSessionFactory.closeSession();
	}
	static void 命名查询()
	{
		//1 获取连接
		Session s = HibernateSessionFactory.getSession();
		//3 执行查询
		List<Person> list = s.getNamedQuery("find_unusual_sex").list();
		//4 遍历结果
		for(Person p:list)
		{
			System.out.println(p);
		}
		//5 关闭连接
		HibernateSessionFactory.closeSession();
	}
	static void 动态参数查询()  //支持?的hql语句
	{
		//1 获取连接
		Session s = HibernateSessionFactory.getSession();
		//a ?作为动态参数
		//String hql = "from Person where pname like ?";
		//b 取参数别名。
		//c 设置查询属性
		//d 关联查询
		String hql = "from Person where sex =:sex";
		//String hql = "from Person where pname like :name " +
		//		"and sex.sexname =:sex";
		Query q = s.createQuery(hql);

		//a 按照位置指定
		//q.setString(0,"%白%"); //与jdbc不同,从0开始
		/*b 按照别名进行指定
		q.setParameter("name", "%老%");
		q.setParameter("sex", "女性");
		*/
		/*c 采用构造"查询属性"的方法
		Properties pro = new Properties();
		pro.setProperty("name","%老%");
		pro.setProperty("sex", "女性");
		q.setProperties(pro);
		*/
		//d 设置关联对象作为查询条件
		Sex sex = new Sex();
		sex.setSexid(2); //只有sex.主键作为查询条件。
		q.setEntity("sex", sex);//将对象作为sex参数的查询条件
		//3 执行查询
		List<Person> list = q.list();

		//4 遍历结果
		for(Person p:list)
		{
			System.out.println(p);
		}
		//5 关闭连接
		HibernateSessionFactory.closeSession();
	}
	static void sql的查询()
	{
		//1 获取连接
		Session s = HibernateSessionFactory.getSession();
		//2 构造sql语句。找出人数最多的性别名,及它的人数
		SQLQuery q = (SQLQuery) s.getNamedQuery("find_max_count_sex");
		//3 执行查询
		List<Object[]> list = q.list();
		//4 遍历
		for(Object[] fields:list)
		{
			//把每条记录的字段显示查询
			for(Object field:fields)
			{
				System.out.print(field+"\t");
			}
			System.out.println();
		}
		//5 关闭连接
		HibernateSessionFactory.closeSession();
	}
	public static void main(String[] args)
	{
		//完整对象的查询();
		//部分字段的查询();
		//关联条件查询();
		//聚合查询();
		//分页查询();
		//命名查询();
		//动态参数查询();
		sql的查询();
	}
}

  

时间: 2024-08-10 00:00:28

Hibernate---Hql查询2---的相关文章

Hibernate HQL查询:

Hibernate HQL查询:Criteria查询对查询条件进行了面向对象封装,符合编程人员的思维方式,不过HQL(Hibernate Query Lanaguage)查询提供了更加丰富的和灵活的查询特性,因此Hibernate将HQL查询方式立为官方推荐的标准查询方式,HQL查询在涵盖Criteria查询的所有功能的前提下,提供了类似标准SQL语句的查询方式,同时也提供了更加面向对象的封装.完整的HQL语句形势如下:Select/update/delete…… from …… where …

Hibernate HQL查询语句总结

Hibernate HQL查询语句总结 1. 实体查询:有关实体查询技术,其实我们在先前已经有多次涉及,比如下面的例子:String hql="from User user ";List list=session.CreateQuery(hql).list();上面的代码执行结果是,查询出User实体对象所对应的所有数据,而且将数据封装成User实体对象,并且放入List中返回.这里需要注意的是,Hibernate的实体查询存在着对继承关系的判定,比如我们前面讨论映射实体继承关系中的E

转: Hibernate HQL查询 插入 更新(update)实例

1.实体查询:有关实体查询技术,其实我们在先前已经有多次涉及,比如下面的例子:String hql=”from User user ”;List list=session.CreateQuery(hql).list();上面的代码执行结果是,查询出User实体对象所对应的所有数据,而且将数据封装成User实体对象,并且放入List中返回.这里需要注意的是,Hibernate的实体查询存在着对继承关系的判定,比如我们前面讨论映射实体继承关系中的Employee实体对象,它有两个子类分别是 Hour

Hibernate HQL查询 插入 更新(update)实例

1.实体查询:有关实体查询技术,其实我们在先前已经有多次涉及,比如下面的例子:String hql=”from User user ”;List list=session.CreateQuery(hql).list();上面的代码执行结果是,查询出User实体对象所对应的所有数据,而且将数据封装成User实体对象,并且放入List中返回.这里需要注意的是,Hibernate的实体查询存在着对继承关系的判定,比如我们前面讨论映射实体继承关系中的Employee实体对象,它有两个子类分别是 Hour

第六讲(二) Hibernate HQL查询

HQL查询:Criteria查询对查询条件进行了面向对象封装,符合编程人员的思维方式,不过HQL(Hibernate Query Lanaguage)查询提供了更加丰富的和灵活的查询特性,因此Hibernate将HQL查询方式立为官方推荐的标准查询方式,HQL查询在涵盖 Criteria查询的所有功能的前提下,提供了类似标准SQL语句的查询方式,同时也提供了更加面向对象的封装.完整的HQL语句形势如下:Select/update/delete…… from …… where …… group b

Java学习笔记-Hibernate HQL查询

Session是持久层操作的基础,相当于JDBC中的Connection,通过Session会话来保存.更新.查找数据.session是Hibernate运作的中心,对象的生命周期.事务的管理.数据库的存取都与Session有关Session由SessionFactory创建,是线程安全的Thread-Safe,可以让多个线程同时存取SessionFactory而不会有数据共享的问题 Hibernate中Session的解释 :http://blog.csdn.net/shrek_xu/arti

Hibernate hql 查询指定字段并获取结果集(转)

在hibernate中,用hql语句查询实体类,采用list方法的返回结果为一个List,该List中封装的对象分为以下三种情况:1.查询全部字段的情况下,如"from 实体类",list中封装的对象为实体类本身,各属性都将得到填充.2.只查询一个字段,默认情况下,list中封装的是Object对象.3.查询两个或两个以上的字段,默认情况下,list中封装的是Object[],长度与所查询的字段数一致. 对于后两种情况,用标签遍历时不太方便,因为无法直接转换成实体类的对象.比较简单的解

hibernate HQL查询的参数绑定

参数绑定: Hibernate中对动态查询参数绑定提供了丰富的支持,那么什么是查询参数动态绑定呢?其实如果我们熟悉传统JDBC编程的话,我们就不难理解查询参数动态绑定,如下代码传统JDBC的参数绑定: PrepareStatement pre=connection.prepare(“select * from User where user.name=?”); pre.setString(1,”zhaoxin”); ResultSet rs=pre.executeQuery(); 在Hibern

Hibernate hql查询的本地时间函数TO_DAYS()

Hibernate 的hql表示从日期类型转换成天数.例如: //此条hql语句表示购买的日期介于哪个时间段. <pre name="code" class="java"><span style="font-size:18px;">String hql = "from Assets a where TO_DAYS(a.buydate)>=TO_DAYS(?) and TO_DAYS(a.buydate)&l

Hibernate HQL查询异常:java.lang.ClassCastException解决

有时候,我们查询只需要查询bean的某一个部分,而不需要它所有的属性,这时候HQL就可以这样写: 假设有一个类User(省略getter setter): public class User { private String name; private int age; private boolean sex; } 如果只需要查询姓名和年龄,则HQL可以这样写:select new User(name,age) from User; 此时实体类中需要有一个new User(name,age) 这