入門 06 - Query介面

转载 2006年05月20日 00:39:00
除了直接使用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查詢的操作,您可以查看參考手冊的第九章內容。

相关文章推荐

06分布式数据仓库 HIVE -- 数据的查询(HQL Hive Query Language)

where查询 select * from user where name = ‘liguozhong’;       where 操作是在多个map端进行的。 group by sele...

SPOJ375——Query on a tree(树链剖分模板详解以及入门)

You are given a tree (an acyclic undirected connected graph) with N nodes, and edges numbered 1, 2, ...

Query_Find Form开发入门

1. 打开Template.fmb,并另存为一个名字(QUERYFIND.fmb) 2.从Window,Canvas,Data Block中删除BLOCKNAME,从Data Blo...

Framework Manager入门教程(十四) - 设定查询处理类型(Query Processing)

这里,我们分享下FM中的一些知识,我们在Framework Manager中对于数据源的配置可以2中设置方式 这里的查询处理类型有2个选择 官方介绍: 数据源的查询处理属性可确定 SQL 处理是由数...

SPOJ 375 Query on a tree[树链剖分入门]

原文地址:树链剖分[若侵权,请私信,必删]  “在一棵树上进行路径的修改、求极值、求和”乍一看只要线段树就能轻松解决,实际上,仅凭线段树是不能搞定它的。我们需要用到一种貌似高级的复杂算法——树链剖分...

Hibernate入门(四)query查询分组排序

query查询分组排序

C# 入门(15) LINQ(Language Integrated Query)

C#的LINQ

Elasticsearch(入门篇)——Query DSL与查询行为

http://www.cnblogs.com/miqi1992/p/5708553.html ES提供了丰富多彩的查询接口,可以满足各种各样的查询要求。更多内容请参考:ELK...

Python入门教程-06 字符串

1. Overview 前面快速浏览了Python的运行环境

AR入门系列-06-Vuforia文字识别

先将TextRecognition和Word预制件拖到Hierarchy视图中 点击TextRecognition,第一使用,标注2中会提示添加Wordlist 我们需要在官网中下载案例,...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:入門 06 - Query介面
举报原因:
原因补充:

(最多只允许输入30个字)