`

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 List<Student> query(){
		Session session = HibernateSessionFactory.getSession();
		Query q = session.getNamedQuery("findStudentByName");
		q.setString("name", "zhangsan");
		List<Student> 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 List<Student> query(){
	Session session = HibernateSessionFactory.getSession();
	Query q = session.getNamedQuery("com.test.bean.Student.findStudentByName");
	q.setString("name", "zhangsan");
	List<Student> 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 List<Student> query(){
	Session session = HibernateSessionFactory.getSession();
	Query q = session.getNamedQuery("findStudentByName");
	q.setString("name", "zhangsan");
	List<Student> 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 List<Object[]> query(){
	Session session = HibernateSessionFactory.getSession();		
	Query query = session.getNamedQuery("findStudentByName");  
	query.setString("name", "zhangsan");  
	List<Object[]> list = query.list();  	        
	return list;
}
或者:
public List<Student> query(){
	Session session = HibernateSessionFactory.getSession();
	Query q = session.getNamedQuery("findStudentByName").
setResultTransformer(Transformers.aliasToBean(Student.class));
	q.setString("name", "zhangsan");
	List<Student> list = q.list();	        
	return list;
}
 

 

0
0
分享到:
评论
发表评论

文章已被作者锁定,不允许评论。

相关推荐

    hibernate中的查询方式

    ### Hibernate中的查询方式详解 #### 一、HQL查询(Hibernate Query Language) HQL是Hibernate提供的面向对象的查询语言,其语法与SQL相似但并非完全相同。HQL的一个显著优势在于它具有很好的跨数据库能力,这...

    hibernate自定义查询

    命名查询是在Hibernate配置文件(如Query.hbm.xml)中预定义的HQL或Criteria查询,具有良好的可读性和可维护性。例如,在Query.hbm.xml中定义一个命名查询: ```xml &lt;hibernate-mapping&gt; &lt;!-- ... --&gt; from ...

    hibernate查询详解

    本文将详细介绍Hibernate的五种查询方式,包括HQL查询、Criteria方法、动态查询DetachedCriteria、例子查询、SQL查询以及命名查询,以满足不同场景下的需求。 1. HQL查询: Hibernate Query Language(HQL)是一种...

    Hibernate的查询方式

    Hibernate作为Java领域中最流行的ORM(Object-Relational Mapping)框架之一,提供了一系列高效、灵活的查询机制,旨在桥接对象模型与关系数据库之间的鸿沟。本文将深入探讨Hibernate的查询方式,特别聚焦于HQL...

    Hibernate_query查询数据表中部分字段.

    本文将深入探讨如何使用Hibernate进行数据表中的部分字段查询,这在实际开发中是非常常见的需求。 首先,理解Hibernate的核心概念:实体(Entity)、持久化类(Persistent Class)和映射文件(Mapping File)。实体...

    Hibernate查询方式代码示例

    在`hibernate.cfg.xml`或实体类的`@NamedQuery`注解中定义命名查询: ```xml FROM Student WHERE age &gt; 20 ``` 在代码中使用: ```java Query query = session.getNamedQuery("getStudentsOverAge"); ...

    Hibernate HQL命名参数和Query接口的分页

    在Java的持久化框架Hibernate中,HQL(Hibernate Query Language)是用于操作对象关系映射(ORM)的SQL方言,提供了更加面向对象的查询方式。本篇将详细讲解HQL中的命名参数以及如何通过Query接口实现分页查询,这...

    Hibernate 在查询操作中要使用分页+命名参数+排序技术

    以上就是关于“Hibernate在查询操作中使用分页+命名参数+排序技术”的详细介绍。在实际开发中,熟练掌握这些技巧能帮助我们写出高效、安全且易于维护的代码。希望这篇文章对你有所帮助,更多关于Hibernate的源码分析...

    hibernate 级联查询

    虽然描述部分为空,但根据给定的博文链接,我们可以推测文章可能详细解释了Hibernate中的级联查询概念,可能包括实际应用示例和源码解析。博主可能通过具体的例子展示了如何配置和使用级联查询,以及可能遇到的问题...

    hibernate公共查询

    - `findByNamedQuery(queryName, params)`: 使用预定义的命名查询,这些查询可以在`hbm.xml`映射文件中定义,或通过`@NamedQuery`注解在实体类上声明。 - `countByExample(entity)`: 计算满足特定条件的记录数,...

    Hibernate查询解决方案

    ### Hibernate查询解决方案详解 #### 一、概述 Hibernate 是一个开放源代码的 ORM(对象关系映射)框架,它提供了从 ...在实际项目开发中,合理运用 Hibernate 查询功能,可以有效提高数据访问效率和程序的可维护性。

    Hibernate HQL查询 分页查询 模糊查询.docx

    1. **命名参数**: 在HQL查询中推荐使用命名参数而非位置参数,因为命名参数更易于理解和维护。 2. **性能优化**: 对于大型数据集,应考虑使用`setFirstResult`和`setMaxResults`进行分页查询以提高效率。 3. **错误...

    hibernate 命名查询如何实现

    在Java持久化框架Hibernate中,命名查询是一种强大的功能,它允许开发者在映射文件中预定义HQL(Hibernate Query Language)或SQL查询,从而提高代码的可读性和可维护性。这种方式将查询语句与业务逻辑分离,使得...

    Hibernate5中文用户使用手册

    JNDI和锁:JNDI(Java Naming and Directory Interface)用于在Java应用程序中访问命名和目录服务。锁部分则介绍了乐观锁和悲观锁的概念及其使用方法。 Fetching(抓取):抓取是指Hibernate如何从数据库中获取数据...

    hibernate annotation 中文文档

    - `@NamedQuery`: 预定义命名查询,可以在多个地方重用。 7. **缓存** - `@Cacheable`: 标记实体类或方法支持缓存,提高性能。 - `@Cache`: 配置缓存区域和策略,如读写策略、时间戳等。 8. **转换器与自定义...

    Hibernate官方中文参考手册下载

    在Hibernate中,每个Java类都可以映射为数据库中的一个表,通过注解或者XML文件进行配置。注解如@Entity、@Table、@Id等用于声明实体类和字段的数据库属性。XML文件通常命名为 "*.hbm.xml",包含类到表的映射信息。 ...

    Hibernate+中文文档

    16.2. 命名SQL查询 16.2.1. 使用return-property来明确地指定字段/别名 16.2.2. 使用存储过程来查询 16.3. 定制SQL用来create,update和delete 16.4. 定制装载SQL 17. 过滤数据 17.1. Hibernate 过滤器...

    hibernate3 中文API

    1. **实体映射(Entity Mapping)**: Hibernate 3使用XML文件(通常命名为.hbm.xml)或注解来定义Java类与数据库表之间的映射关系。通过这种方式,Java对象可以直接保存到数据库,无需编写SQL语句。 2. **配置文件...

    hibernate3中文官方文档

    Hibernate 使用 XML 文件(通常命名为 `*.hbm.xml`)或注解方式来定义对象与数据库表之间的映射关系,这个过程称为 ORM 映射。映射文件包含了实体类的属性与数据库字段的对应、主键生成策略、关联关系等信息。 四、...

    六种方式实现hibernate查询

    命名查询是一种使用Hibernate的命名查询机制的方式。示例代码: ```java static void query(String name){ Session s=null; try{ s=HibernateUtil.getSession(); Query query=s.getNamedQuery("Admin.getByName...

Global site tag (gtag.js) - Google Analytics