hibernate学习之第五篇

news/2024/6/29 2:09:47

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来操作。
例子:

·from Person
·from User user where user.name=:name
·from User user where user.name=:name and user.birthday<:birthday

 

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());
        }
}

 

还可以使用命名参数的方法:只需要修改两处即可。

写道
String hql = "from User as user where user.userName=:name";
query.setString("name", name);
 

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则提供了面向对象的查询模式


http://www.niftyadmin.cn/n/2864073.html

相关文章

深入浅出hibernate摘录

以下摘自深入浅出hibernate&#xff1a; DAO模式中&#xff0c;数据库访问层实现被隐藏到Data Accessor中&#xff0c;前面说过&#xff0c;DAO模式实际上是两个模式的组合&#xff0c;即Data Accessor和domain Object模式。 何谓Data Accessor&#xff1f;即将数据访问的实现…

动态代理模式使用初探

jdk文档&#xff1a; 写道动态代理类&#xff08;以下简称为代理类&#xff09;是一个实现在创建类时在运行时指定的接口列表的类&#xff0c;该类具有下面描述的行为。 代理接口 是代理类实现的一个接口。代理实例 是代理类的一个实例。 每个代理实例都有一个关联的调用处理程…

深入浅出hibernate摘录2

以下内容摘自深入浅出hibernate 在编写代码的时候&#xff0c;尽量将POJO的getter/setter方法设定为public&#xff0c;如果设定为private&#xff0c;protected&#xff0c;hibernate将无法对属性的存取进行优化&#xff0c;只能转而采用传统的反射机制进行操作&#xff08;hi…

区分运行时异常和编译时异常

jianchen 写道当你确信方法的使用者会处理你的方法抛出的异常时&#xff0c;可以使用编译时异常。不处理编译时异常&#xff0c;程序编译不能通过。而运行时异常给了方法的调用者以选择&#xff0c;他可以选择处理&#xff0c;也可以不处理。处理的话&#xff0c;进行catch即可…

hibernate 学习之第六篇

基于主键的一对一关联 Person类和IdCard&#xff0c;一对一映射。 person的属性为&#xff1a;id&#xff0c;name&#xff0c;idCard IdCard的属性为&#xff1a;id&#xff0c;usefulLife&#xff0c;person 由于身份证和人是一对一的&#xff0c;身份证的id和人的id可以相同…

hibernat学习之第七篇

多对多关联关系的映射 在操作和性能方面都不太理想&#xff0c;所以多对多的映射使用较少&#xff0c;实际使用中最好转换成一对多的对象模型&#xff1b;hibernate会为我们创建中间关联表&#xff0c;转换成两个一对多。 核心配置&#xff1a; <set name"ss" t…

Redis——基于主从复制实现高可用(redis-sentinel)

一.sentinel哨兵模式介绍 Sentinel(哨兵)是用于监控redis集群中Master状态的工具&#xff0c;是Redis 的高可用性解决方案&#xff0c;sentinel哨兵模式已经被集成在redis2.4之后的版本中。sentinel是redis高可用的解决方案&#xff0c;sentinel系统可以监视一个或者多个redis …

hibernate学习之第八篇

组件映射 关联的属性是个复杂类型的持久化类&#xff0c;但不是实体即&#xff1a;数据库中没有表与该属性对应&#xff0c;但该类的属性要持久保存的。 对于单表的对象细分&#xff0c;在hibernate中可借助Component节点的定义完成。 何谓Component&#xff1f;从名字上来看&…