使用Hibernate的HQL常常需要在Java代码中写字符串查询语句,为了使业务逻辑和查询语句分离,可以把字符串查询语句定义在映射文件中。
<?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.Customer" table="CUSTOMERS"> <id name="id" column="ID" type="long"> <generator class="native"/> </id> <property name="name" column="NAME" type="string"/> <set name="orders" cascade="all" inverse="true"> <key column="CUSTOMER_ID"/> <one-to-many class="com.Order"/> </set> </class> <!-- 定义查询语句 --> [color=red]<query name="findCustomerByName"><![CDATA[ from Customer c where c.name like :name ]]></query>[/color] </hibernate-mapping>
Query query = session.getNamedQuery("findCustomerByName");
query.setString("name", "B%");
Iterator customers = query.iterate();
while (customers.hasNext()) {
Customer customer = (Customer)customers.next();
System.out.println("Customer Id:" + customer.getId() + " name:" + customer.getName());
}
/**Output:
Hibernate: select customer0_.ID as col_0_0_ from CUSTOMERS customer0_ where customer0_.NAME like ?
Hibernate: select customer0_.ID as ID1_0_, customer0_.NAME as NAME1_0_ from CUSTOMERS customer0_ where customer0_.ID=?
Customer Id:27 name:Bruce
Hibernate: select customer0_.ID as ID1_0_, customer0_.NAME as NAME1_0_ from CUSTOMERS customer0_ where customer0_.ID=?
Customer Id:29 name:Bird
Hibernate: select customer0_.ID as ID1_0_, customer0_.NAME as NAME1_0_ from CUSTOMERS customer0_ where customer0_.ID=?
Customer Id:31 name:Bruce Chen
Hibernate: select customer0_.ID as ID1_0_, customer0_.NAME as NAME1_0_ from CUSTOMERS customer0_ where customer0_.ID=?
Customer Id:32 name:BB
*/