• 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+"	");
    			}
    			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+"	");
    			}
    			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+"	");
    			}
    			System.out.println();
    		}
    		//5 关闭连接
    		HibernateSessionFactory.closeSession();
    	}
    	public static void main(String[] args) 
    	{
    		//完整对象的查询();
    		//部分字段的查询();
    		//关联条件查询();
    		//聚合查询();
    		//分页查询();
    		//命名查询();
    		//动态参数查询();
    		sql的查询();
    	}
    }
    

      

  • 相关阅读:
    nodeJS操作mongoDB常用api
    git命令
    Scala笔记(1)——基本知识
    Akka Java 中文文档
    训练:用gfsh执行常见的任务
    https://confluence.jnj.com/display/AAIM/Enterprise+Agile+Data+Services
    gfsh操作
    java知识
    maven使用之烦人的.lastUpdated文件
    idea相关操作
  • 原文地址:https://www.cnblogs.com/ipetergo/p/6339592.html
Copyright © 2020-2023  润新知