Hibernate的命名查询(NamedQuery)

来源:互联网 发布:网络词 抓马什么梗 编辑:程序博客网 时间:2024/06/05 13:21


在hibernate开发中,可以把HQL语句或SQL语句写在Hibernate实体类对应的映射文件中的。

打开Hibernate的Session的源码,我们可以看到有一个getNamedQuery(String name);的方法,如下:

Java代码  收藏代码
  1. /** 
  2.      * Obtain an instance of <tt>Query</tt> for a named query string defined in the 
  3.      * mapping file. 
  4.      * 
  5.      * @param queryName the name of a query defined externally 
  6.      * @return Query 
  7.      * @throws HibernateException 
  8.      */  
  9.     public Query getNamedQuery(String queryName) throws HibernateException;  

 

这个方法就是可以执行定义在Hibernate实体类映射文件中的HQL或Sql语句。

具体做法下面我一一讲解,首先测试在映射文件中定义HQL语句。

我在User实体类的映射文件中定义了一个name为getUserByName的HQL查询语句,代码如下:

Xml代码  收藏代码
  1. <?xml version="1.0"?>  
  2. <!DOCTYPE hibernate-mapping PUBLIC   
  3.     "-//Hibernate/Hibernate Mapping DTD 3.0//EN"  
  4.     "D:\tools\hibernate\dtd\hibernate-mapping-3.0.dtd">  
  5. <hibernate-mapping   
  6.     package="com.xigua.domain">  
  7.     <class name="User">  
  8.         <id name="id">  
  9.             <generator class="native"/>  
  10.         </id>  
  11.         <property name="name"/>  
  12.         <property name="birthday"/>  
  13.     </class>  
  14.       
  15.     <!-- 定义一个查询,名称为getUserByName -->  
  16.     <query name="getUserByName">  
  17.         <![CDATA[from User where name = :name]]>  
  18.     </query>  
  19. </hibernate-mapping>  

 

然后编写测试类使用Session中的getNamedQuery(String name)方法进行测试,代码如下:

Java代码  收藏代码
  1. package com.xigua.test;  
  2.   
  3. import java.util.Date;  
  4. import java.util.List;  
  5.   
  6. import org.hibernate.Query;  
  7. import org.hibernate.Session;  
  8. import org.hibernate.Transaction;  
  9.   
  10. import com.xigua.domain.User;  
  11. import com.xigua.utils.HibernateUtil;  
  12.   
  13. public class Test9 {  
  14.   
  15.     public static void main(String[] args) {  
  16.         addUser();  
  17.         String name = "xigua";  
  18.         List<User> list = namedQuery(name);  
  19.         if(list != null && !list.isEmpty()) {  
  20.             for(User user : list) {  
  21.                 System.out.println(user.getId() + ", " + user.getName() + ", " + user.getBirthday());  
  22.             }  
  23.         }  
  24.     }  
  25.       
  26.     public static void addUser() {  
  27.         Session session = null;  
  28.         Transaction tx = null;  
  29.         try{  
  30.             session = HibernateUtil.getSession();  
  31.             tx = session.beginTransaction();  
  32.             User user = new User();  
  33.             user.setName("xigua");  
  34.             user.setBirthday(new Date());  
  35.             session.save(user);  
  36.               
  37.             user = new User();  
  38.             user.setName("donggua");  
  39.             user.setBirthday(new Date());  
  40.             session.save(user);  
  41.             tx.commit();  
  42.         } catch(Exception e) {  
  43.             if(tx != null) {  
  44.                 tx.rollback();  
  45.             }  
  46.         } finally {  
  47.             if(session != null) {  
  48.                 session.close();  
  49.             }  
  50.         }  
  51.     }  
  52.       
  53.     public static List<User> namedQuery(String name) {  
  54.         Session session = null;  
  55.         try{  
  56.             session = HibernateUtil.getSession();  
  57.             Query query = session.getNamedQuery("getUserByName");  
  58.             query.setParameter("name", name);  
  59.             return query.list();  
  60.         }catch(Exception e) {  
  61.             e.printStackTrace();  
  62.         } finally {  
  63.             if(session != null) {  
  64.                 session.close();  
  65.             }  
  66.         }  
  67.           
  68.         return null;  
  69.     }  
  70.   
  71. }  

 注意红色部分代码。

 

在映射文件中除了可以定义HQL语句,也还是可以定义Sql语句的。

前面的User实体类的映射文件修改如下:

Xml代码  收藏代码
  1. <?xml version="1.0"?>  
  2. <!DOCTYPE hibernate-mapping PUBLIC   
  3.     "-//Hibernate/Hibernate Mapping DTD 3.0//EN"  
  4.     "D:\tools\hibernate\dtd\hibernate-mapping-3.0.dtd">  
  5. <hibernate-mapping   
  6.     package="com.xigua.domain">  
  7.     <class name="User">  
  8.         <id name="id">  
  9.             <generator class="native"/>  
  10.         </id>  
  11.         <property name="name"/>  
  12.         <property name="birthday"/>  
  13.     </class>  
  14.       
  15.     <!-- 定义一个查询,名称为getUserByName   
  16.     <query name="getUserByName">  
  17.         <![CDATA[from User where name = :name]]>  
  18.     </query>  
  19.     -->  
  20.       
  21.     <sql-query name="getUserByName">  
  22.         <![CDATA[select id, name from user where name = :name]]>  
  23.     </sql-query>  
  24. </hibernate-mapping>  

 

测试代码如下:

Java代码  收藏代码
  1. package com.xigua.test;  
  2.   
  3. import java.util.Date;  
  4.   
  5. import org.hibernate.Query;  
  6. import org.hibernate.Session;  
  7. import org.hibernate.Transaction;  
  8.   
  9. import com.xigua.domain.User;  
  10. import com.xigua.utils.HibernateUtil;  
  11.   
  12. public class Test10 {  
  13.       
  14.     public static void main(String args[]) {  
  15.         addUser();  
  16.         String name = "xigua";  
  17.         User user = namedSqlQuery(name);  
  18.         if(user != null) {  
  19.             System.out.println(user.getId() + ", " + user.getName());  
  20.         }  
  21.           
  22.     }  
  23.       
  24.     public static void addUser() {  
  25.         Session session = null;  
  26.         Transaction tx = null;  
  27.         try{  
  28.             session = HibernateUtil.getSession();  
  29.             tx = session.beginTransaction();  
  30.             User user = new User();  
  31.             user.setName("xigua");  
  32.             user.setBirthday(new Date());  
  33.             session.save(user);  
  34.               
  35.             user = new User();  
  36.             user.setName("donggua");  
  37.             user.setBirthday(new Date());  
  38.             session.save(user);  
  39.             tx.commit();  
  40.         } catch(Exception e) {  
  41.             if(tx != null) {  
  42.                 tx.rollback();  
  43.             }  
  44.         } finally {  
  45.             if(session != null) {  
  46.                 session.close();  
  47.             }  
  48.         }  
  49.     }  
  50.       
  51.     public static User namedSqlQuery(String name) {  
  52.         Session session = null;  
  53.         try{  
  54.             session = HibernateUtil.getSession();  
  55.             Query query = session.getNamedQuery("getUserByName");  
  56.             query.setParameter("name", name);  
  57.             Object[] obj = (Object[]) query.uniqueResult();  
  58.             if(obj != null) {  
  59.                 User user = new User();  
  60.                 user.setId(Long.valueOf(obj[0].toString()));  
  61.                 user.setName(obj[1].toString());  
  62.                 return user;  
  63.             }  
  64.         }catch(Exception e) {  
  65.             e.printStackTrace();  
  66.         } finally {  
  67.             if(session != null) {  
  68.                 session.close();  
  69.             }  
  70.         }  
  71.           
  72.         return null;  
  73.     }  
  74.   
  75. }  

 

映射文件中还有些其它的配置,暂时还没具体搞懂,比如下面红色的代码:

Xml代码  收藏代码
  1. <sql-query name="getUserByName">  
  2.         <![CDATA[select id, name from user where name = :name]]>  
  3.         <query-param name="name" type="string"/>  
  4.         <return></return>  
  5.         <return-join alias="" property=""></return-join>  
  6.         <return-scalar column=""/>  
  7.         <synchronize table=""/>  
  8.     </sql-query>  

 

 

还有一点像说明的是<query>跟<sql-query>的配置是可以放到<class>节点里面的。

我现在是放在<class>节点外面,表示全局可用,这里需要注意不要跟其它映射文件中定义的<query>或<sql-query>同名。

如果将<query>或<sql-query>放在<class>节点里面,在java代码中使用的时候需要将package名跟class名都写上,具体见下面配置的映射文件代码跟测试代码。

映射文件代码:

Xml代码  收藏代码
  1. <?xml version="1.0"?>  
  2. <!DOCTYPE hibernate-mapping PUBLIC   
  3.     "-//Hibernate/Hibernate Mapping DTD 3.0//EN"  
  4.     "D:\tools\hibernate\dtd\hibernate-mapping-3.0.dtd">  
  5. <hibernate-mapping   
  6.     package="com.xigua.domain">  
  7.     <class name="User">  
  8.         <id name="id">  
  9.             <generator class="native"/>  
  10.         </id>  
  11.         <property name="name"/>  
  12.         <property name="birthday"/>  
  13.           
  14.         <!-- 定义一个查询,名称为getUserByName (这里将<query>放到<class>节点里面来)-->   
  15.         <query name="getUserByName">  
  16.             <![CDATA[from User where name = :name]]>  
  17.         </query>  
  18.       
  19.     </class>  
  20.       
  21.       
  22.       
  23. </hibernate-mapping>  

 java测试代码(注意下图红色部分字符串)

Java代码  收藏代码
  1. package com.xigua.test;  
  2.   
  3. import java.util.Date;  
  4. import java.util.List;  
  5.   
  6. import org.hibernate.Query;  
  7. import org.hibernate.Session;  
  8. import org.hibernate.Transaction;  
  9.   
  10. import com.xigua.domain.User;  
  11. import com.xigua.utils.HibernateUtil;  
  12.   
  13. public class Test9 {  
  14.   
  15.     public static void main(String[] args) {  
  16.         addUser();  
  17.         String name = "xigua";  
  18.         List<User> list = namedQuery(name);  
  19.         if(list != null && !list.isEmpty()) {  
  20.             for(User user : list) {  
  21.                 System.out.println(user.getId() + ", " + user.getName() + ", " + user.getBirthday());  
  22.             }  
  23.         }  
  24.     }  
  25.       
  26.     public static void addUser() {  
  27.         Session session = null;  
  28.         Transaction tx = null;  
  29.         try{  
  30.             session = HibernateUtil.getSession();  
  31.             tx = session.beginTransaction();  
  32.             User user = new User();  
  33.             user.setName("xigua");  
  34.             user.setBirthday(new Date());  
  35.             session.save(user);  
  36.               
  37.             user = new User();  
  38.             user.setName("donggua");  
  39.             user.setBirthday(new Date());  
  40.             session.save(user);  
  41.             tx.commit();  
  42.         } catch(Exception e) {  
  43.             if(tx != null) {  
  44.                 tx.rollback();  
  45.             }  
  46.         } finally {  
  47.             if(session != null) {  
  48.                 session.close();  
  49.             }  
  50.         }  
  51.     }  
  52.       
  53.     public static List<User> namedQuery(String name) {  
  54.         Session session = null;  
  55.         try{  
  56.             session = HibernateUtil.getSession();  
  57.             Query query = session.getNamedQuery("<span style="color: #ff0000;">com.xigua.domain.User.getUserByName</span>");  
  58.             query.setParameter("name", name);  
  59.             return query.list();  
  60.         }catch(Exception e) {  
  61.             e.printStackTrace();  
  62.         } finally {  
  63.             if(session != null) {  
  64.                 session.close();  
  65.             }  
  66.         }  
  67.           
  68.         return null;  
  69.     }  
  70.   
  71. }  
0 0