hibernate 命名查询如何实现

y先生007

y先生007

2016-02-19 11:35

下面请跟着图老师小编一起来了解下hibernate 命名查询如何实现,精心挑选的内容希望大家喜欢,不要忘记点个赞哦!
什么是命名查询?
Hibernate允许在映射文件中定义字符串形式的查询语句,这种查询方式成为命名查询
使用命名查询有什么好处?
由于使用Hibernate的HQL常常需要在Java代码中写字符串查询语句,HQL混杂在代码之间,破坏代码可读性,通过使用命名查询,可以使业务逻辑和查询语句分离,使您专注于查询,而避免了 SQL 或者 HQL 代码分散于整个应用程序中的情况。
可以应用命名查询做复杂查询的处理
命名查询如何实现?
介绍下面几种方式:
方法一:在配置文件中class/标记的下面,声明查询语句
代码如下:

hibernate-mapping
class name="com.test.bean.Student" table="student" catalog="users"
id name="id" type="integer"
column name="id" /
generator class="identity" /
/id
property name="name" type="string"
column name="name" length="11" /
/property
property name="age" type="integer"
column name="age" /
/property
property name="sex" type="string"
column name="sex" length="2" /
/property
/class
!-- 定义查询语句 --
query name="findStudentByName"
![CDATA[from Student where name = :name]]
/query
/hibernate-mapping

备注:![CDATA[ ]]是什么意思?
标明是纯文本的,没有这个的话 & 字符是不能直接存入XML的,需要转义,而用这个标记则不需要转义而将这些符号存入XML文档。可以避免未预料的特殊符号导致XML解析出错。
代码如下:

public ListStudent query(){
Session session = HibernateSessionFactory.getSession();
Query q = session.getNamedQuery("findStudentByName");
q.setString("name", "zhangsan");
ListStudent list = q.list();
return list;
}

方法二:也可以在配置文件中class/标记的里面,声明查询语句, 但是java代码调用时需要指定(包+类+配置名)
代码如下:

hibernate-mapping
class name="com.test.bean.Student" table="student" catalog="users"
id name="id" type="integer"
column name="id" /
generator class="identity" /
/id
property name="name" type="string"
column name="name" length="11" /
/property
property name="age" type="integer"
column name="age" /
/property
property name="sex" type="string"
column name="sex" length="2" /
/property
!-- 定义查询语句 --
query name="findStudentByName"
![CDATA[from Student where name = :name]]
/query
/class
/hibernate-mapping
public ListStudent query(){
Session session = HibernateSessionFactory.getSession();
Query q = session.getNamedQuery("com.test.bean.Student.findStudentByName");
q.setString("name", "zhangsan");
ListStudent list = q.list();
return list;
}

方法三:使用原生sql查询sql-query,使用此种方式必须把表所有的列写全才可以,否则会出现‘列名无效'的错误 ,除非你使用return-scalar来设置字段类型。
代码如下:

hibernate-mapping
class name="com.test.bean.Student" table="student" catalog="users"
id name="id" type="integer"
column name="id" /
generator class="identity" /
/id
property name="name" type="string"
column name="name" length="11" /
/property
property name="age" type="integer"
column name="age" /
/property
property name="sex" type="string"
column name="sex" length="2" /
/property
/class
!-- 定义查询语句 --
sql-query name="findStudentByName"
return alias="s" class="com.test.bean.Student"
/return
![CDATA[select {s.*} from student s where s.name = :name]]
/sql-query
/hibernate-mapping

备注:也可以在return/标记里面应用return-property/标记将表的所有字段列出来,与上面描述的方法一样,都是查询出来所有列。
代码如下:

public ListStudent query(){
Session session = HibernateSessionFactory.getSession();
Query q = session.getNamedQuery("findStudentByName");
q.setString("name", "zhangsan");
ListStudent list = q.list();
return list;
}

方法四:使用原生sql查询sql-query, 如果应用return-scalar来设置字段类型, 就可以实现查询部分字段。
代码如下:

hibernate-mapping
class name="com.test.bean.Student" table="student" catalog="users"
id name="id" type="integer"
column name="id" /
generator class="identity" /
/id
property name="name" type="string"
column name="name" length="11" /
/property
property name="age" type="integer"
column name="age" /
/property
property name="sex" type="string"
column name="sex" length="2" /
/property
/class
!-- 定义查询语句 --
sql-query name="findStudentByName"
return-scalar column="name" type="string"/
return-scalar column="age" type="integer"/
![CDATA[select s.name , s.age from student s where s.name = :name]]
/sql-query
/hibernate-mapping
public ListObject[] query(){
Session session = HibernateSessionFactory.getSession();
Query query = session.getNamedQuery("findStudentByName");
query.setString("name", "zhangsan");
ListObject[] list = query.list();
return list;
}

或者
代码如下:

public ListStudent query(){
Session session = HibernateSessionFactory.getSession();
Query q = session.getNamedQuery("findStudentByName").
setResultTransformer(Transformers.aliasToBean(Student.class));
q.setString("name", "zhangsan");
ListStudent list = q.list();
return list;
}
展开更多 50%)
分享

猜你喜欢

hibernate 命名查询如何实现

编程语言 网络编程
hibernate 命名查询如何实现

Hibernate分页查询原理解读

Java JAVA基础
Hibernate分页查询原理解读

s8lol主宰符文怎么配

英雄联盟 网络游戏
s8lol主宰符文怎么配

在JavaScript中实现命名空间

Web开发
在JavaScript中实现命名空间

Ajax实现分页查询

Web开发
Ajax实现分页查询

lol偷钱流符文搭配推荐

英雄联盟 网络游戏
lol偷钱流符文搭配推荐

VC命名管道通信的实现

编程语言 网络编程
VC命名管道通信的实现

Java开发中关于Hibernate对多表关联查询

编程语言 网络编程
Java开发中关于Hibernate对多表关联查询

lolAD刺客新符文搭配推荐

英雄联盟
lolAD刺客新符文搭配推荐

bool当成函数参数错误理解

bool当成函数参数错误理解

ios多种语言的本地化思路

ios多种语言的本地化思路
下拉加载更多内容 ↓