1, oracle数据库中,user是关键字,如果用户的表名为user会引起冲突。采取的方法主要有两种:
①如果可以修改表名,最好改变表名为tuser或其他的名字,免得引起麻烦。
②如果表名不能修改,那么可以在配置文件中加上反引号,让oracle把user当做字符串处理,而不是关键字。
如下:
<hibernate-mapping package="hibernatetest"> <class name="User" table="`user`"> <id name="id" > <generator class="hilo"></generator> </id> <property name="userName"></property> <property name="birthday"></property> </class> </hibernate-mapping>
同理,字段名发生冲突,也可以采用这种办法。
2,HQL
HQL,hibernate查询语言,类似于sql但与sql又有很大的不同,它是面向对象的。HQL中的对象名是区分大小写的(除了java类和属性,其他部分不区分大小写);HQL中查的是对象而不是表,并且支持多态;HQL主要通过query来操作。
例子:
3,query接口的使用
public static void query(String name) { Session session = HibernateUtil.getSession(); String hql = "from User as user where user.userName=?"; Query query = session.createQuery(hql); query.setString(0, name); List<User> list = query.list(); for (User user : list) { System.out.println(user.getUserName()); } }
还可以使用命名参数的方法:只需要修改两处即可。
query接口的分页查询:
query接口有两个方法:query.setFirstResult(int) --设置从第几条记录开始读取, query.setMaxResults(int)--设置最多读取的记录数
各数据库的分页查询方法不同,比如mysql采取的是limit关键字,所以query接口的分页查询屏蔽了底层的数据库,实现了跨平台。
如果确认查询的结果最多有一条,则可以使用query的query.uniqueResult()方法。
4,条件查询
criteria是比HQL 更面向对象的查询方式;Criteria的创建方式:
Criteria crit = session.createCriteria(DomainClass.class);
简单属性条件约束如:
criteria.add(Restrictions.eq(propertyName),value); criteria.add(Restrictions.eqProperty(propertyName,otherPropertyName));
Query和Criteria作为Hinbernate数据查询接口,提供了查询条件的封装机制。
两者的不同之处在于,Query面向HQL和Native SQL,而Criteria则提供了面向对象的查询模式 。