Hibernate入门06 - Query接口
来源:互联网 发布:思民挂机软件 编辑:程序博客网 时间:2024/05/16 13:04
除了直接使用find()方法并配合HQL来进行查询之外,我们还可以透过 net.sf.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 (net.sf.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>之前,例如:
User.hbm.xml
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping
PUBLIC "-//Hibernate/Hibernate Mapping DTD//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd">
<hibernate-mapping>
<class name="onlyfun.caterpillar.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="onlyfun.caterpillar.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("onlyfun.caterpillar.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);
}
更多有关于Hibernate查询的操作,您可以查看参考手册的第九章内容。
- Hibernate入门06 - Query接口
- Hibernate入门06 - Query接口
- Hibernate的Query接口
- Hibernate中query接口
- Hibernate系列之----Query接口
- Hibernate-HQL Query接口简介
- Hibernate中的核心接口query接口用法
- Hibernate中的核心接口query接口用法
- Hibernate入门之Query界面
- Hibernate 入门----Query,Criteria,SQLQuery
- Hibernate的核心接口 --- Query查询详解
- Hibernate之Query接口的uniqueResult()方法
- Hibernate之Query接口的uniqueResult()方法
- Hibernate之Query接口的uniqueResult()方法
- Hibernate之Query接口的uniqueResult()方法
- Hibernate之Query接口的uniqueResult()方法
- Hibernate的Query接口和查询操作
- Hibernate的核心接口 --- Query查询详解
- Hibernate入门02 - 第一个Hibernate程序
- Hibernate入门02 - 第一个Hibernate程序
- Hibernate入门03 - 配置文件
- Hibernate入门04 - 提供JDBC连接
- Hibernate入门05 - 基本数据查询
- Hibernate入门06 - Query接口
- 在Vs.net中使用MSN即时通讯软件(上)
- Hibernate入门07 - 更新,删除数据
- 在Vs.net中使用MSN即时通讯软件(下)
- 布列瑟农的忧伤
- Hibernate入门08 - 继承映射1
- Hibernate入门09 - 继承映射2
- Hibernate入门10 - Component 映射
- COM引用记数的三个规则