Hibernate的Hql查询

    技术2022-05-19  56

     

    实体类:User.java

    package com.hibernateHql;

    public class User {

    private int id;

    private String name;

    private String sex;

    private int age;

    public User(){

    }

    public User(int id, String name, int age) {

    super();

    this.id = id;

    this.name = name;

    this.age = age;

    }

    public int getId() {

    return id;

    }

    public void setId(int id) {

    this.id = id;

    }

    public String getName() {

    return name;

    }

    public void setName(String name) {

    this.name = name;

    }

    public String getSex() {

    return sex;

    }

    public void setSex(String sex) {

    this.sex = sex;

    }

    public int getAge() {

    return age;

    }

    public void setAge(int age) {

    this.age = age;

    }

    }

    配置文件:User.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">

        <hibernate-mapping>

        <class name="com.hibernateHql.User">

        <id name="id">

         <generator class="identity"/> 

        </id>

        <property name="name"/>

          <property name="sex"/>

            <property  type="int" name="age"/>

        </class>

    </hibernate-mapping>

    Hibernate的配置文件: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">

    <hibernate-configuration>

    <session-factory>

    <property name="show_sql">true</property>

    <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>

    <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>

    <property name="hibernate.connection.url">jdbc:mysql://localhost/hibernate_hql</property>

    <property name="hibernate.connection.username">root</property>

    <property name="hibernate.connection.password">123</property>

    <mapping resource="com/hibernateHql/User.hbm.xml"/>

    </session-factory>

    </hibernate-configuration>

    生成表的ExportDB.java

    package com.hibernateHql;

    import org.hibernate.cfg.Configuration;

    import org.hibernate.tool.hbm2ddl.SchemaExport;

    public class ExportDB {

    /**

     * @param args

     */

    public static void main(String[] args) {

    Configuration cfg=new Configuration().configure();

    SchemaExport export=new SchemaExport(cfg);

    export.create(true, true);

    }

    }

    // 工具类HibernateUnit

    package com.hibernateHql;

    import org.hibernate.HibernateException;

    import org.hibernate.Session;

    import org.hibernate.SessionFactory;

    import org.hibernate.cfg.Configuration;

    public class HibernateUnit {

    private static SessionFactory factory;

    static{

    try {

    Configuration cfg=new Configuration().configure();

    factory=cfg.buildSessionFactory();

    } catch (HibernateException e) {

    // TODO Auto-generated catch block

    e.printStackTrace();

    }

    }

    public static Session getsession(){

    return factory.openSession();

    };

    }

    Junit的测试类:

    package com.hibernateHql;

    import java.util.ArrayList;

    import java.util.HashMap;

    import java.util.HashSet;

    import java.util.Iterator;

    import java.util.List;

    import java.util.Map;

    import java.util.Set;

    import org.hibernate.HibernateException;

    import org.hibernate.Query;

    import org.hibernate.Session;

    import junit.framework.TestCase;

    public class TestSet extends TestCase{

    public void savetest(){

    Session session=HibernateUnit.getsession();

    User users1=new User();

    users1.setName("jiangfei");

    users1.setAge(19);

    users1.setSex("");

    User users2=new User();

    users2.setName("huangnan");

    users2.setAge(20);

    users2.setSex("man");

    User users3=new User();

    users3.setName("包云飞");

    users3.setAge(19);

    users3.setSex("man");

    User users4=new User();

    users4.setName("wushuang");

    users4.setAge(19);

    users4.setSex("girl");

    session.save(users1);

    session.save(users2);

    session.save(users3);

    session.save(users4);

    session.beginTransaction().commit();

    session.close();

    }

    public void savetest2(){

    Session session=HibernateUnit.getsession();

    for(int i=0;i<20;i++){

    User user=new User();

    user.setName("jiangfei"+i);

    user.setSex("sex"+i);

    user.setAge(i);

    session.save(user);

    }

    session.beginTransaction().commit();

    session.close();

    }

    //单个属性的查询

    public void queryHql(){

    Session session=HibernateUnit.getsession();

    Query query=session.createQuery("select name from User");

    List users=query.list();

        Iterator it=users.iterator();

    while (it.hasNext()) {

    String name=(String) it.next();

    System.out.println(name);

    }

    session.beginTransaction().commit();

    }

    //多个属性查询

    public void queryHql_many(){

    Session session=HibernateUnit.getsession();

    /*/查询的User对象的id,name,age 又重新组成一个新的User对象,如果查询的属性不是一个,则对查询的

     * 

     * 进行封装,也就是在User的实例实例里面添加一个构造方法public User(id,name,age){}

     * 默认的构造方法也写上所以查询得到的对象就是User

     */

    Query query=session.createQuery("select new User(id,name,age) from User");

    List users=query.list();

    Iterator it=users.iterator();

    while (it.hasNext()) {

    User user=(User) it.next();

    System.out.println(user.getId());

    System.out.println(user.getName());

                System.out.println(user.getAge());

    }

    session.beginTransaction().commit();

    }

    //给实例区别名进行查询

    //多个属性查询

    public void queryHql_As(){

    Session session=HibernateUnit.getsession();

    //User 实例区别名为 u

    Query query=session.createQuery("select u from User u");

    List users=query.list();

    Iterator it=users.iterator();

    while (it.hasNext()) {

    User user=(User) it.next();

    System.out.print(user.getId()+"/t");

    System.out.print(user.getName()+"/t");

    System.out.print(user.getSex()+"/t");

                System.out.print(user.getAge()+"/n");

    }

    session.beginTransaction().commit();

    }

    //多条数据查询 

    public void manyQuery_iterate(){

    Session session=HibernateUnit.getsession();

    //从数据得到的数据只有一条,一级缓存中只有一条数据,每次输出就会再次向数据库中发送sql语句 也就出现N+1的问题

    Iterator<User> users=session.createQuery("from User").iterate();

    while (users.hasNext()) {

    User user=users.next();

    System.out.print(user.getId()+"/t");

    System.out.print(user.getName()+"/t");

    System.out.print(user.getSex()+"/t");

                System.out.print(user.getAge()+"/n");

    }

    session.beginTransaction().commit();

    session.close();

    }

    // 解决N+1的问题list把取到的数据放在一级缓存中 查询数据时不用再向数据库发送Sql语句

    public void manyQuery_list(){

    Session session=HibernateUnit.getsession();

    //从数据得到的数据只有一条,一级缓存中只有一条数据,每次输出就会再次向数据库中发送sql语句 也就出现N+1的问题

    List<User> userlist=session.createQuery("from User").list();

    Iterator<User> users=userlist.iterator();

    // Iterator<User> users=session.createQuery("from User").iterate();

    while (users.hasNext()) {

    User user=users.next();

    System.out.print(user.getId()+"/t");

    System.out.print(user.getName()+"/t");

    System.out.print(user.getSex()+"/t");

                System.out.print(user.getAge()+"/n");

    }

    session.beginTransaction().commit();

    session.close();

    }

    }


    最新回复(0)