Query接口

来源:互联网 发布:马德华回族知乎 编辑:程序博客网 时间:2024/05/18 03:21
除了直接使用find()方法并配合HQL来进行查询之外,我们还可以通过org.hibernate.Query接口的实例来进行查询,通过Query接口,您可以先设定查询参数,之后通过setXXX()等方法,将指定的参数值填入,而不用每次都书写完整的HQL,直接来看个例子:
代码:
Query query = session.createQuery("select user.name from User as user where user.age = ? and user.sex = ?");query.setInteger(0, 25);query.setCharacter(1, 'M');List names = query.list();for (ListIterator iterator = names.listIterator(); iterator.hasNext(); ) {String name = (String) iterator.next();System.out.println("name: " + name);}


在设定参数值时,必须依照 ? 所设定的顺序,并使用对应型态的setXXX()方法,一个执行的例子如下:
代码:
log4j:WARN No appenders could be found for logger (org.hibernate.cfg.Environment).log4j:WARN Please initialize the log4j system properly.Hibernate: select user0_.name as x0_0_ from USER user0_ where (user0_.age=? )and(user0_.sex=? )name: Bush


您可以使用命名参数(Named Parameter)来取代这个方法,这可以不用依照特定的顺序来设定参数值,并拥有较好的可读性,直接来看个例子:
代码:
Query query = session.createQuery("select user.name from User as user where user.age = :age and user.sex = :sex");query.setInteger("age", 25);query.setCharacter("sex", 'M');List names = query.list();for (ListIterator iterator = names.listIterator(); iterator.hasNext(); ) {String name = (String) iterator.next();System.out.println("name: " + name);}


设定命名参数时,在建立Query时先使用:后跟着参数名,之后我们就可以在setXXX()方法中直接指定参数名来设定参数值,而不用依照特定的顺序。
我们也可以将HQL书写在程序之外,以避免硬编码(hard code)在程序之中,在需要修改HQL时就很方便,在*.hbm.xml中使用<query/>标签,并在<![CDATA[与]]>之间书写HQL,书写的位置是在</hibernate-mapping>之前,例如:
代码:
<?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.xtedu.teach.hibernate.mappings.User" table="USER"><id name="id" type="string"><column name="user_id" sql-type="char(32)" /><generator class="uuid.hex"/></id><property name="name" type="string" not-null="true"><column name="name" length="16" not-null="true"/></property><property name="sex" type="char"/><property name="age" type="int"/></class><query name="com.xtedu.teach.hibernate.mappings.queryUser"><![CDATA[select user.name from User as user where user.age = :age and user.sex = :sex]]></query></hibernate-mapping>


<query>的name属性用来设定查询外部HQL时的名称依据,使用的例子如下:
代码:
Query query = session.getNamedQuery("com.xtedu.teach.hibernate.mappings.queryUser");query.setInteger("age", 25);query.setCharacter("sex", 'M');List names = query.list();for (ListIterator iterator = names.listIterator(); iterator.hasNext(); ) {String name = (String) iterator.next();System.out.println("name: " + name);}

原创粉丝点击