入門 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查詢的操作,您可以查看參考手冊的第九章內容。

一个简单额Python MVC框架(3)

MVC中的M已经介绍完了,C和V都是用户代码,先看几个工具类:A)全局变量类,用户定义全局变量和一个用于产生普通对象的类型:gl_A=1 gl_B='a' class Obj: def __i...
  • hawksoft
  • hawksoft
  • 2015年03月28日 16:54
  • 1762

Java初学者入门指南

跟其他语言相比,大家或许会觉得Java很难,因为Java一开始给人的感觉就不是平易近人和蔼可亲的,甚至对于从未接触过Java的人而言,Java是非常难上手的。其实,完全是一种偏见,Java的入手,可以...
  • u010619705
  • u010619705
  • 2013年05月29日 11:45
  • 485

Mybatis入門實例

一 工程目錄結構
  • jungle0127
  • jungle0127
  • 2014年05月18日 00:43
  • 368

Mybatis入門筆記

Mybatis入門筆記Mybatis入門筆記 了解Mybatis持久层框架 Mybatis的jar包下载 日志文件的配置 Mybatis的工作流程了解Mybatis——持久层框架首先了解ibatis ...
  • kidmiddle
  • kidmiddle
  • 2016年11月01日 17:36
  • 166

Photon + Unity3D 线上游戏开发 学习笔记(一)

大家好, 我也是学习Photon + unity3D 的新手 有什么说错
  • nicepainkiller
  • nicepainkiller
  • 2014年05月25日 13:33
  • 4128

SCSS 15分鐘入門

原文地址:http://eddychang.me/blog/others/91-scss-15-mins.html SCSS(Sassy CSS,時髦的CSS)是SASS中的一種新式語法,SAS...
  • u013692049
  • u013692049
  • 2017年03月29日 16:45
  • 250

Docker 實作入門

Docker 實作入門 建立日期 2014-12-05 09:46      最近更新在 2014-12-17 16:23作者是 黃儀銘 目的 主要介紹 Docker 的實作,會提到以...
  • xinghun_4
  • xinghun_4
  • 2015年08月22日 10:55
  • 467

redis 入門筆記

# String ##set get set mykey "abc" get mykey set counter 100 ##incr counter return 101 ##incrby ...
  • mochong
  • mochong
  • 2017年03月28日 14:34
  • 58

Unity3D游戏开发入门学习笔记

学习内容概要: 软件面板功能、材质球、预制体、摄像机、灯光、鼠标键盘输入、组件、刚体、碰撞体、PC端游戏打包发布.... 第1课:课程介绍与Unity3D环境搭建 1.Unity3D,一...
  • JNBINW
  • JNBINW
  • 2017年01月21日 17:06
  • 1238

如何快速入门产品经理?

“豆瓣给我了思考产品问题的思路和做自己喜欢做的事情空间。”“微软则给了我更广的视野,学习到更规范、国际标准的产品工作流程和做事方式。”这是徐萌的经历,在SDCC上,她将基于这些经历和经验分享产品上的心...
  • whywhom
  • whywhom
  • 2015年11月18日 12:55
  • 791
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:入門 06 - Query介面
举报原因:
原因补充:

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