使用HibernateTemplate查询Clob内的内容

使用HibernateTemplate检索Clob字段内容
本文介绍如何在项目中使用HibernateTemplate针对Clob字段进行检索操作,通过使用dbms_lob.instr函数筛选特定内容,并利用回调函数处理本地化查询。

在项目中要对数据表的Clob字段进行检索,用于Clob是采用字节方式存储的,因此普通的查询语句不能检索Clob字段内的内容,使用SELECT * FROM 表名 WHERE dbms_lob.instr(表名.Clob字段名,'内容',1,1) > 0;
或 SELECT * FROM 表名 别名 WHERE dbms_lob.instr(别名.Clob字段名, '内容', 1, 1) > 0;语句可以检索Clob内的内容,使用Spring的HibernateTemplate执行上述语句的例子如下:
所采用的数据表:

drop table csms_ps_genericContent;
create table csms_ps_genericContent (
    id char(32) not null,                                            --ID
    categoryId varchar2(60) not null,                    --类别ID
    featureId varchar2(60) null,                            --专题ID
    title varchar2(150) not null,                            --标题
    titlePicPath varchar2(500) null,                    --标题图片路径
    publishTime date not null,                                --发布时间
    content clob not null,                                        --内容
    keyword varchar2(255) null,                                --关键字
    isChar char(1) default '1',                                --是否是文字内容
       
    primary key (id)
);
 


使用HIbernateTemplate的实现方法是:

@SuppressWarnings("unchecked")
    public List<GenericContentModel> fullTextSearch(final String queryContent) throws Exception {
        final String queryString = "select * from CSMS_PS_GENERICCONTENT gc " +
                "where dbms_lob.instr(gc.content, :queryContent, 1, 1) > 0 or gc.title like :title";
        return (List<GenericContentModel>)super.execute(new HibernateCallback() {
            public Object doInHibernate(Session session) {
                SQLQuery query = session.createSQLQuery(queryString);
                query.addEntity("gc", GenericContentModel.class);
                query.setString("queryContent", queryContent);
                query.setString("title", new StringBuffer("%").append(queryContent).append("%").toString());
               
                return query.list();
            }
        });
    }
 

在此使用到了Hibernate回调函数,用来处理好ibernate的本地化查询queryContent是查询条件,由于使用了SQLQuery,query.setEntity()方法指定查询结果对应的实体类。

<think> 我们使用SpringHibernateTemplate进行查询时,通常有几种方式。HibernateTemplateSpring框架为了简化Hibernate的数据访问而提供的一个模板类,它封装了常见的数据库操作,并处理了诸如会话管理、异常转换等繁琐工作。 常见的查询方式包括: 1. 使用HibernateTemplate的find(String queryString)方法进行HQL查询。 2. 使用HibernateTemplate的find(String queryString, Object... values)方法进行带参数的HQL查询。 3. 使用HibernateTemplate的findByCriteria(DetachedCriteria criteria)方法进行条件查询(Criteria查询)。 4. 使用HibernateTemplate的get(Class entityClass, Serializable id)方法根据主键查询单个对象。 5. 使用HibernateTemplate的execute(HibernateCallback callback)方法执行回调,用于更复杂的操作。 下面给出一些示例代码: 示例1:使用HQL查询所有用户 假设有一个User实体类。 代码: ```java List<User> users = hibernateTemplate.find("from User"); ``` 示例2:使用带参数的HQL查询 ```java List<User> users = hibernateTemplate.find("from User where name = ?", "张三"); ``` 注意:在Hibernate 5.2及以上版本,HibernateTemplate的find方法中参数位置查询使用?)已被标记为过时,推荐使用命名参数。但HibernateTemplate本身并不直接支持命名参数,所以我们通常使用回调方式或者使用Hibernate 5的SessionFactory来实现命名参数查询。不过,我们可以使用另一种方式:使用带参数数组的方法,并传入命名参数对应的值。 但是,HibernateTemplate提供了一种更灵活的方式:使用HibernateCallback。 示例3:使用Criteria查询 ```java DetachedCriteria criteria = DetachedCriteria.forClass(User.class); criteria.add(Restrictions.eq("name", "张三")); List<User> users = hibernateTemplate.findByCriteria(criteria); ``` 示例4:根据主键查询 ```java User user = hibernateTemplate.get(User.class, 1L); ``` 示例5:使用回调进行命名参数查询 ```java List<User> users = hibernateTemplate.execute(new HibernateCallback<List<User>>() { @Override public List<User> doInHibernate(Session session) throws HibernateException { Query<User> query = session.createQuery("from User where name = :name", User.class); query.setParameter("name", "张三"); return query.list(); } }); ``` 注意:在Spring 5.2及以上版本,由于HibernateTemplateHibernate 5.x的支持,也可以使用HibernateTemplate的executeWithNativeSession方法,但通常我们使用上面的回调方式。 解释: HibernateTemplate提供了很多便利的方法,但有时为了使用Hibernate的新特性(如命名参数、分页等),我们可能需要使用回调方式。回调方式让我们可以直接使用Hibernate的Session对象,从而获得更大的灵活性。 另外,需要注意的一点是,HibernateTemplate会自动将HibernateExceptions转换为Spring的DataAccessExceptions,这样我们就可以在业务层统一处理数据访问异常。 然而,随着SpringHibernate的集成越来越完善,现在更推荐使用SessionFactory和Hibernate的Session API结合@Transactional注解来管理事务,或者使用Spring Data JPA。HibernateTemplate在较新的Spring版本中已经不再被积极开发,但现有的代码中仍然广泛使用。 如果你使用的是较新的Spring版本(如Spring 5.x)和Hibernate 5.x,建议直接使用SessionFactory和Hibernate的Session API,或者使用Spring Data JPA。不过,对于维护旧项目,理解HibernateTemplate仍然很重要。 下面,我将按照要求提出相关问题: §§相关问题§§: 1. HibernateTemplateHibernate的Session有什么区别? 2. 在HibernateTemplate中如何进行分页查询? 3. HibernateTemplate如何管理事务? 4. 为什么说HibernateTemplate在较新的Spring版本中不再被推荐使用? </think> ### 使用 Spring HibernateTemplate 进行查询的方式 `HibernateTemplate` 是 Spring 框架为简化 Hibernate 操作提供的模板类,封装了常见的数据库操作(如查询、保存、更新)。以下是其核心查询方法的详细说明和代码示例: #### 1. **基本 HQL 查询** ```java // 查询所有用户 List<User> userList = hibernateTemplate.find("FROM User"); // 带参数的查询 List<User> users = hibernateTemplate.find( "FROM User WHERE age > ? AND department = ?", 25, "Engineering" ); ``` **解释**: - `find(String hql)` 直接执行 HQL 语句。 - 参数用 `?` 占位,按顺序传入值(自动防 SQL 注入)。 --- #### 2. **命名参数查询** ```java List<User> users = hibernateTemplate.findByNamedParam( "FROM User WHERE name = :name AND status = :status", new String[] {"name", "status"}, // 参数名数组 new Object[] {"Alice", "ACTIVE"} // 参数值数组 ); ``` **解释**: - `findByNamedParam` 支持命名参数(`:paramName`)。 - 需指定参数名数组和值数组,提高可读性与安全性。 --- #### 3. **条件查询(Criteria)** ```java List<User> users = hibernateTemplate.execute(session -> { Criteria criteria = session.createCriteria(User.class); criteria.add(Restrictions.gt("age", 30)); // 年龄>30 criteria.add(Restrictions.like("name", "J%")); // 名字以J开头 return criteria.list(); }); ``` **解释**: - 通过 `execute()` 接收 `HibernateCallback` 函数式接口。 - 使用 `Criteria` 构建类型安全的查询条件。 --- #### 4. **主键查询(Get/Load)** ```java // 立即查询返回实体或null) User user1 = hibernateTemplate.get(User.class, 1L); // 延迟加载(返回代理对象) User user2 = hibernateTemplate.load(User.class, 2L); ``` **区别**: - `get()`:立即访问数据库,结果不存在时返回 `null`。 - `load()`:延迟加载,访问非 ID 属性时才查数据库,结果不存在时抛 `ObjectNotFoundException`。 --- #### 5. **分页查询** ```java List<User> users = hibernateTemplate.execute(session -> { Query query = session.createQuery("FROM User ORDER BY createTime DESC"); query.setFirstResult(0); // 起始位置 query.setMaxResults(10); // 每页数量 return query.list(); }); ``` **关键点**: - `setFirstResult()` 设置偏移量(如第 2 页:`setFirstResult(10)`)。 - `setMaxResults()` 设置每页记录数。 --- #### 6. **SQL 原生查询** ```java List<Object[]> results = hibernateTemplate.execute(session -> { SQLQuery sqlQuery = session.createSQLQuery("SELECT name, age FROM users"); return sqlQuery.list(); }); ``` **说明**: - 直接执行原生 SQL,返回 `Object[]` 数组或通过 `addEntity()` 映射实体。 --- ### 为什么使用 HibernateTemplate? 1. **资源管理自动化**:自动处理 Session 的打开/关闭、异常转换(HibernateExcepiton → Spring DataAccessException)。 2. **事务集成**:与 Spring 声明式事务无缝协作(`@Transactional`)。 3. **模板模式**:减少样板代码(如 try-catch 块)。 ### 注意事项 - **过时声明**:新项目建议用 `SessionFactory` + `@Transactional` 或 Spring Data JPA。 - **延迟加载**:在事务边界外访问延迟加载的属性会引发 `LazyInitializationException`。 - **性能优化**:批量查询避免 N+1 问题,推荐使用 `JOIN FETCH`。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值