Hibernate查询2
Hibernate查询2
list()方法和interate()方法的区别:
list()方法是立即查询,interate()这个方法是延迟查询,iterate首先是先发送一条sql语句查询所有符合条件的id,然后根据查询到的id获得对应的记录。
iterate 这个方法支持一级缓存,也就是session缓存
list方法不支持一级缓存。
代码:
@Test public void testQuery19(){ //group by 测试 String hql = "select p.password, count(p.id) from Person p group by p.password"; Query query = session.createQuery(hql); List<Object[]> list = query.list(); System.out.println("--size---"+list.size()); for(Object[] o : list){ System.out.println(o[0]+"----"+o[1]); } } @Test public void testQuery18(){ //排序 String hql = "from Person p order by p.id desc"; Query query = session.createQuery(hql); List<Person> list = query.list(); System.out.println("--size---"+list.size()); for(Person p : list){ System.out.println(p); } } @Test public void testQuery17(){ //hibernate推荐将 HQL 定义到一个专门的配置文件中 //然后通过getNamedQuery方法获得参数指定查询语句 Query query = session.getNamedQuery("seletePerson3"); List<Person> list = query.list(); System.out.println("--size---"+list.size()); for(Person p : list){ System.out.println(p); } } @Test public void testQuery16(){ //hibernate推荐将 HQL 定义到一个专门的配置文件中 //然后通过getNamedQuery方法获得参数指定查询语句 Query query = session.getNamedQuery("seletePerson2"); List<Person> list = query.list(); System.out.println("--size---"+list.size()); for(Person p : list){ System.out.println(p); } } @Test public void testQuery15(){ //hibernate推荐将 HQL 定义到一个专门的配置文件中 //然后通过getNamedQuery方法获得参数指定查询语句 Query query = session.getNamedQuery("seletePerson"); query.setString("n", "%_8"); List<Person> list = query.list(); System.out.println("--size---"+list.size()); for(Person p : list){ System.out.println(p); } } @Test public void testQuery14(){ //String hql = "from Person p where p.name like '%_8'"; //hibernate 支持 模糊查询 String hql = "from Person p where p.name like :n"; Query query = session.createQuery(hql); //query.setString("n", "'%_8'");//错误:不能使用 单引号 query.setString("n", "%_8"); List<Person> list = query.list(); System.out.println("--size---"+list.size()); for(Person p : list){ System.out.println(p); } } @Test public void testQuery13(){ String hql = "from Person p where p.id in(:ids)"; Query query = session.createQuery(hql); //query.setParameterList("ids", new Object[]{3,9,6}); List idList = new ArrayList(); idList.add(3); idList.add(6); idList.add(9); query.setParameterList("ids", idList); //query.setParameterList("ids", idList,IntegerType); List<Person> list = query.list(); System.out.println("--size---"+list.size()); for(Person p : list){ System.out.println(p); } } @Test public void testQuery12(){ String hql = "from Person p where p.id in(3,6,9)"; Query query = session.createQuery(hql); List<Person> list = query.list(); System.out.println("--size---"+list.size()); for(Person p : list){ System.out.println(p); } } @Test public void testQuery11(){ //hibernate提供了 命名参数绑定 方式 进行参数赋值 String hql = "from Person p where p.name = ?1 and p.password = ?2"; Query query = session.createQuery(hql); //在执行list()之前通过 query.setXxx();进行参数绑定 //参数1:表示命名参数占位符的名称 //参数2:表示实际的参数值 query.setString("1", "admin_8"); query.setInteger("8",131); List<Person> list = query.list(); System.out.println("--size---"+list.size()); for(Person p : list){ System.out.println(p); } } @Test public void testQuery10(){ //hibernate提供了 命名参数绑定 方式 进行参数赋值 String hql = "from Person p where p.name =:n"; Query query = session.createQuery(hql); //在执行list()之前通过 query.setXxx();进行参数绑定 //参数1:表示命名参数占位符的名称 //参数2:表示实际的参数值 query.setString("n", "admin_8"); List<Person> list = query.list(); System.out.println("--size---"+list.size()); for(Person p : list){ System.out.println(p); } } @Test public void testQuery9(){ //可以同类型JDBC中 ? 占位符 进行条件参数 绑定 String hql = "from Person p where p.name =?"; Query query = session.createQuery(hql); //在执行list()之前通过 query.setXxx();进行参数绑定 //参数1:表示占位符的位置(hibernate中占位符的位置是从 0 开始的,JDBC是从 1 开始) //参数2:表示实际的参数值 query.setString(0, "admin_8"); List<Person> list = query.list(); System.out.println("--size---"+list.size()); for(Person p : list){ System.out.println(p); } }
推荐使用配置文件这种方式来写HQL语句。
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping SYSTEM "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd" > <hibernate-mapping package="bean"> <!-- 推荐将 HQL 语句定义的一个统一的配置文件中方便以后维护 注意: 语句不能有 分号 --> <query name="seletePerson"> from Person p where p.name like :n </query> <!-- 如果有一些特殊符号可以 对应的转换符 替代 (可以参考editplus中的特殊符号) --> <query name="seletePerson2"> from Person p where p.id < 5 </query> <!-- 如果有一些特殊符号还可以 使用 CDATA进行忽略处理 --> <query name="seletePerson3"> <![CDATA[from Person p where p.id < 5]]> </query> </hibernate-mapping>
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping SYSTEM "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd" > <hibernate-mapping package="bean"> <class name="Person" table="t_person" batch-size="2"> <id name="id"> <generator class="identity"/> </id> <property name="name" column="t_name"/> <property name="password" column="t_pass"/> <property name="birthday" type="timestamp"/> </class> </hibernate-mapping>
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"> <hibernate-configuration> <session-factory> <!-- 显示执行SQL语句 --> <property name="show_sql">true</property> <!-- 格式化SQL语句 --> <property name="format_sql">false</property> <!-- 驱动 --> <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property> <!-- 数据库url--> <property name="hibernate.connection.url">jdbc:mysql:///hibernate_db</property> <!-- 访问数据库用户名 --> <property name="hibernate.connection.username">root</property> <!-- 访问数据库密码 --> <property name="hibernate.connection.password">root</property> <!-- 方言(为了更好的操作具体的数据库) 如果使用的mysql数据版本在5.5之后的话,方言通常建议使用MySQL5InnoDBDialect MySQLDialect 不支持事务 MySQLInnoDBDialect 支持事务 --> <property name="hibernate.dialect">org.hibernate.dialect.MySQL5InnoDBDialect</property> <!-- 自动创建表结构配置 create-drop 在程序启动的时候创建对应数据库表结构,当SessionFatory关闭的时候会将创建的表结构删除 create 在每次程序启动的时候先删除上次创建的数据库表结构,然后再创建对应新数据库表结构。 update 在每次启动的时候会追加修改的表结构,但是不会影响原来的数据 (通常用这个) validate 在每次启动的时候会验证并修改的表结构。 --> <property name="hibernate.hbm2ddl.auto">update</property> <!-- 引入对应的需要持久化类的配置文件 --> <mapping resource="bean/Person.hbm.xml"/> <!-- 引入一个专门定义HQL语句的文件 ,这样方便以后维护--> <mapping resource="bean/query.xml"/> </session-factory> </hibernate-configuration>