ibernate学习笔记5---实体类或属性名与数据库关键字冲突、hql命名参数、hql实现通用分页

时间:2023-12-23 11:33:38

一、实体类或属性名与数据库关键字冲突问题
1、实体类名与数据库中的关键字冲突
比如:实体表User与oracle中的系统表冲突
解决方式1:在xml中添加table属性,指定表名,使其不与name默认相等

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE hibernate-mapping PUBLIC
  3. "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
  4. "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
  5. <hibernate-mapping package="cn.itcast.hibernate.domain">
  6. <class name="User" table="tb_User">
  7. <!-- 对象标示符,类型可以不写,hibernate自己识别 -->
  8. <id name="id" column="id">
  9. <!-- 指定主键生成方式。
  10. native根据方言判定生成主键的方式
  11. -->
  12. <generator class="native"/>
  13. </id>
  14. <property name="name" column="name" />
  15. <property name="birthday"  />
  16. </class>
  17. </hibernate-mapping>

解决方式2:假如与之对应的表是原来有的,不能修改表名,可以在table属性中添加`` (反引号就是1前面的按键,来指定名称)

<class name="User" table="`User`">

2、属性名与数据库关键字冲突问题
解决方式1;在xml中property节点中添加column属性,指定特定的字段

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE hibernate-mapping PUBLIC
  3. "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
  4. "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
  5. <hibernate-mapping package="cn.itcast.hibernate.domain">
  6. <class name="User" table="tb_User">
  7. <!-- 对象标示符,类型可以不写,hibernate自己识别 -->
  8. <id name="id" column="id">
  9. <!-- 指定主键生成方式。
  10. native根据方言判定生成主键的方式
  11. -->
  12. <generator class="native"/>
  13. </id>
  14. <property name="name" column="name" />
  15. <property name="birthday"  />
  16. </class>
  17. </hibernate-mapping>

解决方式2:不能修改字段名,可以在column属性中添加`` (反引号就是1前面的按键,来指定名称)

<property name="name" column="`name`" />
二、关于hibernate.cfg.xml的所有属性值
可以到hibernate官网下载源码,
hibernate-release-4.2.1.Final\project\etc\hibernate.properties.template

hibernate-release-4.2.1.Final\project\etc\hibernate.properties文件中有所有的可配置的属性值

三、hql的命名参数
例子:
 /**
  * 使用HQL根据name查询方法
  * @param entity
  */
 public static void Query(String name){
  
  Session s = null;
  try {
   s=HIbernateUtil.getSession();
   //HQL:
   //这里的from后面跟的不是表名,而是对象名(类名)
   String hql = "from User as user where user.name=?"; //from Object 支持多态度
   Query query = s.createQuery(hql);
   query.setString(0, name);
   List<User> list=query.list(); //executQuery(); 
   for(User user:list){
    System.out.print(user.getName());
   }
   
   //如果确定数据最多只有一条,可以使用一下的方法简化代码
   User u= (User)query.uniqueResult();
   System.out.print("只有一条数据"+u.getName());
  } finally {
   if(s!=null){
    s.close();
   }
  }
 }
后面的赋值的参数(索引),与?的位置一一相对应。
如果有很多的参数,则方便赋值,很容易出错。
解决方式:使用命名参数:name如:

public static void Query(String name){
  
  Session s = null;
  try {
   s=HIbernateUtil.getSession();
   //HQL:
   //这里的from后面跟的不是表名,而是对象名(类名)//   String hql = "from User as user where user.name=?"; //from Object 支持多态度
   String hql = "from User as user where user.name=:name"; //使用命名参数取代?
   Query query = s.createQuery(hql);
   query.setString("name", name);
   
   //通过Query实现跨数据库的通用分页
   query.setFirstResult(0);//从第多少条开始获取数据
   query.setMaxResults(100);//共取多少条数据
   List<User> list=query.list(); //executQuery(); 
   for(User user:list){
    System.out.print(user.getName());
   }
   
   //如果确定数据最多只有一条,可以使用一下的方法简化代码
   User u= (User)query.uniqueResult();
   System.out.print("只有一条数据"+u.getName());
  } finally {
   if(s!=null){
    s.close();
   }
  }
 }
好处:这样就不依赖位置了,只要名字对应上即可。sql中多次使用同一参数时,一次赋值即可。代码简洁
四、Query接口的分页查询
解释说明:每个数据库都用不同的分页方式,hibernate通过在hibernate.cfg.xml中配置
<property name="hibernate.dialect">org.hibernate.dialect.OracleDialect</property><!-- 方言 -->以识别不同数据库,使低层使用相应的分页方式
//通过Query实现跨数据库的通用分页
   query.setFirstResult(0);//从第多少条开始获取数据
   query.setMaxResults(100);//共取多少条数据
好处:Query接口中的这两个方法,实现了通用的分页方式,增加了程序的可移植性。