ibernate学习笔记5---实体类或属性名与数据库关键字冲突、hql命名参数、hql实现通用分页
一、实体类或属性名与数据库关键字冲突问题
1、实体类名与数据库中的关键字冲突
比如:实体表User与oracle中的系统表冲突
解决方式1:在xml中添加table属性,指定表名,使其不与name默认相等
- <?xml version="1.0" encoding="UTF-8"?>
- <!DOCTYPE hibernate-mapping PUBLIC
- "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
- "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
- <hibernate-mapping package="cn.itcast.hibernate.domain">
- <class name="User" table="tb_User">
- <!-- 对象标示符,类型可以不写,hibernate自己识别 -->
- <id name="id" column="id">
- <!-- 指定主键生成方式。
- native根据方言判定生成主键的方式
- -->
- <generator class="native"/>
- </id>
- <property name="name" column="name" />
- <property name="birthday" />
- </class>
- </hibernate-mapping>
解决方式2:假如与之对应的表是原来有的,不能修改表名,可以在table属性中添加`` (反引号就是1前面的按键,来指定名称)
<class name="User" table="`User`">
2、属性名与数据库关键字冲突问题
解决方式1;在xml中property节点中添加column属性,指定特定的字段
- <?xml version="1.0" encoding="UTF-8"?>
- <!DOCTYPE hibernate-mapping PUBLIC
- "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
- "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
- <hibernate-mapping package="cn.itcast.hibernate.domain">
- <class name="User" table="tb_User">
- <!-- 对象标示符,类型可以不写,hibernate自己识别 -->
- <id name="id" column="id">
- <!-- 指定主键生成方式。
- native根据方言判定生成主键的方式
- -->
- <generator class="native"/>
- </id>
- <property name="name" column="name" />
- <property name="birthday" />
- </class>
- </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接口中的这两个方法,实现了通用的分页方式,增加了程序的可移植性。