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接口中的这两个方法,实现了通用的分页方式,增加了程序的可移植性。
ibernate学习笔记5---实体类或属性名与数据库关键字冲突、hql命名参数、hql实现通用分页的更多相关文章
- swoft orm中的坑(针对实体类的属性名称和数据库字段不相等)
最近在用swoft的orm,发现了一些问题: 首先看下实体类的定义 它的属性名称和所映射的数据库字段名不一致,这个就会导致蛋疼的问题,首先,在我们使用orm的时候,应该使用哪个字段? 我直接说结论,在 ...
- 解决SpringDataJpa实体类中属性顺序与数据库中生成字段顺序不一致的问题
一.在application.yml配置中添加数据库根据实体类自动创建数据库表的配置(这里数据库采用MySQL数据库) jpa: database: MYSQL show-sql: true #Hib ...
- [jnhs]教训之jsp页面无法用jstl取值的坑.真他妈的奇葩,实体类的属性名不能用大写
结果页面永远都是空 调试发现,数据正常的塞进去了 问题解决: https://zhidao.baidu.com/question/570584436.html 实体类的属性名,首字母不能大写,改成小写 ...
- EF + WCF学习笔记——EF实体类序列化
项目中如果 EF + WCF 结合使用,模式应该是EF负责读取数据库,传递数据对象给WCF,WCF再将这些对象传送给客户端.因为WCF传送的对象需要序列化,而EF默认生成的对象并没有序列化,很可能会出 ...
- java实体类的属性名首字母不能大写,不然el表达式无法取值
摘要:Java命名规范中,实体类属性名以小写字母开头,但并没有说不能以大写字母开头,然而事实告诉我,大写真不行 https://www.cnblogs.com/jnhs/p/10025757.html
- Java实体类的属性类型与数据库表字段类型对应表
原文地址:https://blog.csdn.net/lyhjava/article/details/50562786 Java中的数据类型和SQL中的数据类型有很多不一样,需要仔细区分,不然易在开发 ...
- MyBatis学习笔记(四)——解决字段名与实体类属性名不相同的冲突
转自孤傲苍狼的博客:http://www.cnblogs.com/xdp-gacl/p/4264425.html 在平时的开发中,我们表中的字段名和表对应实体类的属性名称不一定都是完全相同的,下面来演 ...
- 【转】MyBatis学习总结(四)——解决字段名与实体类属性名不相同的冲突
[转]MyBatis学习总结(四)——解决字段名与实体类属性名不相同的冲突 在平时的开发中,我们表中的字段名和表对应实体类的属性名称不一定都是完全相同的,下面来演示一下这种情况下的如何解决字段名与实体 ...
- MyBatis学习总结(四)——解决字段名与实体类属性名不相同的冲突(转载)
本文转载自:http://www.cnblogs.com/jpf-java/p/6013307.html 在平时的开发中,我们表中的字段名和表对应实体类的属性名称不一定都是完全相同的,下面来演示一下这 ...
随机推荐
- Linux VPS 免费管理面板推荐
现在各种国内外VPS,云主机横行,越来越多的站长接受在VPS上建站,很多VPS主机售价便宜,性能优秀,但都是基于linux系统的,如openvz的主机,linux服务器系统主要是通过shell命令行来 ...
- mac mysql connection
随着网络日益发展还有os x用户的增多,有可能会需要在自己的x系统中运行mysql+php环境,比如架设网站或者测试之类.简单步骤如下: 1.下载MySQL 5.x 发行版,解压并安装映像中的两个安装 ...
- Mac下配置Maven
1.Java环境变量设置就不说. 但是配置Maven需要检查下Java环境变量的设置.需要检查JAVA_HOME环境变量以及Java命令 wanyakundeMacBook-Pro:Library w ...
- Sqli-labs less 53
Less-53 和less51是一样的,只是这里的mysql错误不会在前台显示,但是对于stacked injection是一样的利用方式 http://127.0.0.1/sqli-labs/Les ...
- Oracle自带的用户
Oracle安装完毕创建数据库实例的时候,会自动生成三个用户sys,system,scott. sys用户是超级管理员,具有最高权限,充当sysdba角色,可以执行create database,默认 ...
- 2016年度 JavaScript 展望(上)
[编者按]本文作者为资深 Web 开发者 TJ VanToll, TJ 专注于移动端 Web 应用及其性能,是<jQuery UI 实践> 一书的作者. 本文系 OneAPM 工程师编译呈 ...
- POJ 3692
Kindergarten Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 4787 Accepted: 2326 Desc ...
- 构建iOS稳定应用架构时方案选择的思考,主要涉及工程结构,数据流思想和代码规范
工程结构架构,减少耦合混乱以及防治需求大改造成结构重构,如何构建稳定可扩展可变换的工程结构的思考 我打算采用Information flow的方式自上而下,两大层分为基础层和展现层的结构.基础层分为多 ...
- C#保留小数位数
1.System.Globalization.NumberFormatInfo provider = new System.Globalization.NumberFormatInfo(); prov ...
- Lua的require和module小结
Lua的require和module小结 module特性是lua5.1中新增的,用于设置Lua文件自己的模块,最常用的方式是module(name,package.seeall),有时候lua文件 ...