Hibernate的命名查询(NamedQuery)
2015-10-18 00:00
579 查看
把HQL语句或SQL语句写在Hibernate实体类对应的映射文件中的使用。
打开Hibernate的Session的源码,我们可以看到有一个getNamedQuery(String name);的方法,如下:
这个方法就是可以执行定义在Hibernate实体类映射文件中的HQL或Sql语句。
具体做法下面我一一讲解,首先测试在映射文件中定义HQL语句。
我在User实体类的映射文件中定义了一个name为getUserByName的HQL查询语句,代码如下:
然后编写测试类使用Session中的getNamedQuery(String name)方法进行测试,代码如下:
在映射文件中除了可以定义HQL语句,也还是可以定义Sql语句的。
前面的User实体类的映射文件修改如下:
测试代码如下:
映射文件中还有些其它的配置,暂时还没具体搞懂,比如下面红色的代码:
还有一点像说明的是<query>跟<sql-query>的配置是可以放到<class>节点里面的。
我现在是放在<class>节点外面,表示全局可用,这里需要注意不要跟其它映射文件中定义的<query>或<sql-query>同名。
如果将<query>或<sql-query>放在<class>节点里面,在java代码中使用的时候需要将package名跟class名都写上,具体见下面配置的映射文件代码跟测试代码。
映射文件代码:
java测试代码
来自为知笔记(Wiz)
打开Hibernate的Session的源码,我们可以看到有一个getNamedQuery(String name);的方法,如下:
1 2 3 4 5 6 7 8 9 | /** * Obtain an instance of <tt>Query</tt> for a named query string defined in the * mapping file. * * @param queryName the name of a query defined externally * @return Query * @throws HibernateException */ public Query getNamedQuery(String queryName) throws HibernateException; |
具体做法下面我一一讲解,首先测试在映射文件中定义HQL语句。
我在User实体类的映射文件中定义了一个name为getUserByName的HQL查询语句,代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | <? xml version = "1.0" ?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "D:\tools\hibernate\dtd\hibernate-mapping-3.0.dtd"> < hibernate-mapping package = "com.xigua.domain" > < class name = "User" > < id name = "id" > < generator class = "native" /> </ id > < property name = "name" /> < property name = "birthday" /> </ class > <!-- 定义一个查询,名称为getUserByName--> < query name = "getUserByName" > <![CDATA[from User where name = :name]]> </ query > </ hibernate-mapping > |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 | package com.xigua.test; import java.util.Date; import java.util.List; import org.hibernate.Query; import org.hibernate.Session; import org.hibernate.Transaction; import com.xigua.domain.User; import com.xigua.utils.HibernateUtil; public class Test9 { public static void main(String[] args) { addUser(); String name = "xigua" ; List<User> list = namedQuery(name); if (list != null && !list.isEmpty()) { for (User user : list) { System.out.println(user.getId() + ", " + user.getName() + ", " + user.getBirthday()); } } } public static void addUser() { Session session = null ; Transaction tx = null ; try { session = HibernateUtil.getSession(); tx = session.beginTransaction(); User user = new User(); user.setName( "xigua" ); user.setBirthday( new Date()); session.save(user); user = new User(); user.setName( "donggua" ); user.setBirthday( new Date()); session.save(user); tx.commit(); } catch (Exception e) { &n if (tx != null ) { tx.rollback(); } } finally { if (session != null ) { session.close(); } } } public static List<User> namedQuery(String name) { Session session = null ; try { session = HibernateUtil.getSession(); Query query = session.getNamedQuery( "getUserByName" ); query.setParameter( "name" , name); return query.list(); } catch (Exception e) { e.printStackTrace(); } finally { if (session != null ) { session.close(); } } return null ; } } |
前面的User实体类的映射文件修改如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | <? xml version = "1.0" ?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "D:\tools\hibernate\dtd\hibernate-mapping-3.0.dtd"> < hibernate-mapping package = "com.xigua.domain" > < class name = "User" > < id name = "id" > < generator class = "native" /> </ id > < property name = "name" /> < property name = "birthday" /> </ class > <!-- 定义一个查询,名称为getUserByName <query name="getUserByName"> <![CDATA[from User where name = :name]]> </query> --> < sql-query name = "getUserByName" > <![CDATA[select id, name from user where name = :name]]> </ sql-query > </ hibernate-mapping > |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 | package com.xigua.test; import java.util.Date; import org.hibernate.Query; import org.hibernate.Session; import org.hibernate.Transaction; import com.xigua.domain.User; import com.xigua.utils.HibernateUtil; public class Test10 { public static void main(String args[]) { & addUser(); String name = "xigua" ; User user =namedSqlQuery(name); if (user != null ) { System.out.println(user.getId() + ", " + user.getName()); } } public static void addUser() { Session session = null ; Transaction tx = null ; try { session = HibernateUtil.getSession(); tx = session.beginTransaction(); User user = new User(); user.setName( "xigua" ); user.setBirthday( new Date()); session.save(user); user = new User(); user.setName( "donggua" ); user.setBirthday( new Date()); session.save(user); tx.commit(); } catch (Exception e) { if (tx != null ) { tx.rollback(); } } finally { if (session != null ) { session.close(); } } } public static User namedSqlQuery(String name) { Session session = null ; try { session = HibernateUtil.getSession(); Query query = session.getNamedQuery( "getUserByName" ); query.setParameter( "name" , name); Object[] obj = (Object[]) query.uniqueResult(); if (obj != null ) { User user = new User(); user.setId(Long.valueOf(obj[ 0 ].toString())); user.setName(obj[ 1 ].toString()); return user; } } catch (Exception e) { e.printStackTrace(); 3ff0 } finally { if (session != null ) { session.close(); } } return null ; } } |
1 2 3 4 5 6 7 8 | <sql-query name= "getUserByName" > <![CDATA[select id, name from user where name = :name]]> <query-param name= "name" type= "string" /> < return ></ return > < return -join alias= "" property= "" ></ return -join> < return -scalar column= "" /> <synchronize table= "" /> </sql-query> |
我现在是放在<class>节点外面,表示全局可用,这里需要注意不要跟其它映射文件中定义的<query>或<sql-query>同名。
如果将<query>或<sql-query>放在<class>节点里面,在java代码中使用的时候需要将package名跟class名都写上,具体见下面配置的映射文件代码跟测试代码。
映射文件代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | <? xml version = "1.0" ?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "D:\tools\hibernate\dtd\hibernate-mapping-3.0.dtd"> < hibernate-mapping package = "com.xigua.domain" > < class name = "User" > < id name = "id" > < generator class = "native" /> </ id > <
name = "name" /> < property name = "birthday" /> <!-- 定义一个查询,名称为getUserByName(这里将<query>放到<class>节点里面来)--> < query name = "getUserByName" > <![CDATA[from User where name = :name]]> </ query > </ class > </ hibernate-mapping > |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 | package com.xigua.test; import java.util.Date; import java.util.List; import org.hibernate.Query; import org.hibernate.Session; import org.hibernate.Transaction; import com.xigua.domain.User; import com.xigua.utils.HibernateUtil; public class Test9 { public static void main(String[] args) { addUser(); String name = "xigua" ; List<User> list = namedQuery(name); if (list != null && !list.isEmpty()) { for (User user : list) { System.out.println(user.getId() + ", " + user.getName() + ", " + user.getBirthday()); } } } public static void addUser() { Session session = null ; Transaction tx = null ; try { session = HibernateUtil.getSession(); tx = session.beginTransaction(); User user = new User(); user.setName( "xigua" ); user.setBirthday( new Date()); session.save(user); user = new User(); user.setName( "donggua" ); user.setBirthday( new Date()); session.save(user); tx.commit(); } catch (Exception e) { if (tx != null ) { tx.rollback(); } } finally { if (session != null ) { session.close(); } } } public static List<User> namedQuery(String name) { Session session = null ; try { session = HibernateUtil.getSession(); Query query = session.getNamedQuery( "com.xigua.domain.User.getUserByName" ); query.setParameter( "name" , name); return query.list(); } catch (Exception e) { e.printStackTrace(); } finally { if (session != null ) { session.close(); } } return null ; } 3ff0 } |
相关文章推荐
- 百度编辑器ueditor的简单使用
- QuickFix/N简介
- QuickFIX/N入门:(三)如何配置QuickFIX/N
- InvokeRequired和Invoke
- HDU 5504 GT and sequence(排除陷阱就是正解)——BestCoder Round #60
- hdoj 5504 GT and sequence 【脑子 抽了】
- October Challenge 2015 Rupsa and Equilateral Triangle
- HDU GT and sequence (数的乘积最大)
- /proc/cpuinfo 文件分析(查看CPU信息)
- Juint4源码解读
- String和StringBuilder的相互转化
- query 获取本身的HTML
- spark RDD key/value关联操作
- 【IOS 开发学习总结-OC-53】★★ios开发UI 控件——UISearchBar与UISearchDisplayController
- 详细整理:UITableView优化技巧
- Advanced Fruits(合并字符串+最长公共子序列应用)hdu1503 +动态规划
- pcduino里,Qt无法打开摄像头(调用了opencv)
- Prime Query【ZOJ--3911】
- Common Subsequence(最长公共子序列+动态规划)hdu1159 经典
- Chapter 4 Divide-and-Conquer