`

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 HQL命名参数和Query接口的分页

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

    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.2中文文档(chm格式)

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

    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 过滤器...

    Hibernate 中文 html 帮助文档

    3.4.5. 查询语言中的替换 3.4.6. Hibernate的统计(statistics)机制 3.5. 日志 3.6. 实现NamingStrategy 3.7. XML配置文件 3.8. J2EE应用程序服务器的集成 3.8.1. 事务策略配置 3.8.2. JNDI绑定的...

    hibernate 命名查询如何实现

    Hibernate允许在映射文件中定义字符串形式的查询语句,这种查询方式成为命名查询,需要的朋友可以参考下

    Hibernate中文API

    你可以看到这个类对属性的存取方法(getter and setter method)使用了标准JavaBean命名约定,同时把类属性(field)的访问级别设成私有的(private)。这是推荐的设计,但并不是必须的。Hibernate也可以直接访问...

    hibernate-prj1

    3、Hibernate 框架主要包括持久化对象(PersistentObjects)、Hibernate 配置文件 (一般被命名为*.cfg.xml)、Hibernate 映射文件(一般被命名为*.hbm.xml) 三部分; 4、编译运行基于 Hibernate 框架的工程,需要...

    MyEclipse中hibernate的配置

    和JDBC比较一下,同样都是数据库中间件(DM,Database Middleware),JDBC利用SQL语言操作的是数据,而Hibernate则是利用自己的查询语言Hibernate Query Language(HQL虽然底层还是要转换成sql语言)操作的是持久化对象...

    hibernate 3中的缓存小结

    当应用程序调用Session的save()、update()、savaeOrUpdate()、get()或load(),以及调用查询接口的list()、iterate()或filter()方法时,如果在Session缓存中还不存在相应的对象,Hibernate就会把该对象加入到第一级...

    Hibernate实战(第2版 中文高清版)

     10.1.2 Hibernate应用程序中的事务   10.1.3 使用Java Persistence的事务   10.2 控制并发访问   10.2.1 理解数据库级并发   10.2.2 乐观并发控制   10.2.3 获得额外的隔离性保证   10.3 非事务数据...

    hibernate连接池.doc

    三、Hibernate2和Hibernate3的命名空间有所变化。例如,配置C3P0时的provider_class有Hibernate2环境下使用net.sf.hibernate.connection.C3P0ConnectionProvider,在Hibernate3环境下使用org.hibernate.connection....

    Hibernate命名策略详解

    本文主要介绍了Hibernate命名策略。具有很好的参考价值,下面跟着小编一起来看下吧

    HibernateAPI中文版.chm

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

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

    NULL 博文链接:https://chaoyi.iteye.com/blog/2148012

    最全Hibernate 参考文档

    3.4.5. 查询语言中的替换 3.4.6. Hibernate的统计(statistics)机制 3.5. 日志 3.6. 实现NamingStrategy 3.7. XML配置文件 3.8. J2EE应用程序服务器的集成 3.8.1. 事务策略配置 3.8.2. JNDI绑定的...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part2

     17.1.14 在映射文件中定义命名查询语句  17.1.15 在HQL查询语句中调用函数  17.2 设定查询条件  17.2.1 比较运算  17.2.2 范围运算  17.2.3 字符串模式匹配  17.2.4 逻辑运算  17.2.5 集合运算  17.3 小结...

    hibernate连接池配置

    三、Hibernate2和Hibernate3的命名空间有所变化。例如,配置C3P0时的provider_class有Hibernate2环境下使用net.sf.hibernate.connection.C3P0ConnectionProvider,在Hibernate3环境下使用org.hibernate.connection....

    hibernate 教程

    Hibernate查询语言(Query Language), 即HQL 11.1. 大小写敏感性(Case Sensitivity) 11.2. from 子句 11.3. 联合(Associations)和连接(joins) 11.4. select子句 11.5. 统计函数(Aggregate ...

    springMVC + Hibernate 工程模板

    hibernate dao 操作(一个basedao全部搞定) 两种配置:oracle mysql,切换数据库只要把SessionFactory的配置文件改成对应就可以了 c3p0配置:mysql调试通过,oracle由于存在问题,未配置 spring配置式事务管理...

Global site tag (gtag.js) - Google Analytics