Hibernate中条件查询的困惑!

博主在使用Hibernate进行分页查询时遇到问题,特别是在调整查询语句顺序后导致Freemarker无法获取到对象或出现空指针异常。希望通过调整代码顺序解决问题。
小弟正着手一个项目的开发,由于需要用hibernate,所以开始学习使用!
项目中不可避免的要用到分页,在多方查找资料后,决定使用hibernate的条件查询!
但是在调试中遇到了不少的问题,希望各位大人指点!
首先我的类继承了HibernateDaoSupport
分页查询的方法如下
public PageBean findAllByCriteria(final DetachedCriteria detachedCriteria,
final int pagesize, final int startIndex) {
return (PageBean) getHibernateTemplate().execute(new HibernateCallback() {
public Object doInHibernate(Session session) throws HibernateException, SQLException {
Criteria executableCriteria = detachedCriteria.getExecutableCriteria(session);


int totalCount = ((Integer) executableCriteria.setProjection(Projections.rowCount()).uniqueResult()).intValue();
executableCriteria.setProjection(null);
List list=executableCriteria.setFirstResult((startIndex-1)*pagesize).setMaxResults(pagesize).list();
PageBean pb=new PageBean(list,totalCount,pagesize,startIndex);
return pb;
}
}, true);
}
PageBean 为我的分页bean
问题是这样出现的
int totalCount = ((Integer) executableCriteria.setProjection(Projections.rowCount()).uniqueResult()).intValue();
executableCriteria.setProjection(null);
List list=executableCriteria.setFirstResult((startIndex-1)*pagesize).setMaxResults(pagesize).list();
这样的语句顺序执行后,freemarker不能够获取list中保存的对象,用下面的语句
Iterator it = list.iterator();
while(it.hasNext()){
Person_test p=(Person_test)it.next();
System.out.println(p.getID());
}运行时 控制台会报 类异常错误,如果使用泛行,编译器直接就报错!

如果语句顺序调换即变成这样
List list=executableCriteria.setFirstResult((startIndex-1)*pagesize).setMaxResults(pagesize).list();
int totalCount = ((Integer) executableCriteria.setProjection(Projections.rowCount()).uniqueResult()).intValue();
executableCriteria.setProjection(null);

此时当startIndex=1时,语句正常执行,当startIndex>1时
int totalCount = ((Integer)...
则会报空指针错误!

各位大人帮忙看下,我疏忽了哪里的编码!谢谢了
<think>嗯,我现在遇到一个问题,就是用save_hibernate_object(object)的时候,好像没有保存成功,但是也没有报错提示。这让我有点困惑,因为通常如果有错误的话应该会有异常或者日志记录吧。不过现在没有提示,我得仔细想想可能的原因。 首先,我应该检查Hibernate的事务管理。Hibernate的操作通常需要在事务内提交才能生效。可能我在调用save方法后没有提交事务,导致数据没有被持久化到数据库。比如,如果用的是编程式事务,可能需要手动commit;如果是声明式事务,可能方法上没有加@Transactional注解,导致事务没有正确开启。 然后,看看数据库连接配置是否正确。如果数据库连接有问题,比如URL、用户名或密码错误,Hibernate可能在连接池里保持了连接,但实际无法连接,这时候操作可能不会立即报错,而是在提交事务的时候才会发现问题。不过这种情况下,通常事务提交时会抛异常,但可能我的配置有问题,或者连接池设置导致延迟报错。 接下来,自动提交的设置。有些数据库配置默认是自动提交的,但Hibernate通常会禁用自动提交,依赖事务管理。如果事务没有正确提交,数据就不会保存。我需要确认Hibernate的配置里hibernate.connection.autocommit是不是被错误地设置为true,或者没有正确配置事务管理器。 还有,检查是否真的调用了save方法。有时候代码逻辑可能有条件判断,导致save方法没有被执行到。比如,可能在某个if分支里调用了save,但条件不满足,所以实际没有执行。这时候需要调试或者加日志,确认代码执行路径。 持久化对象的ID生成策略也可能有问题。如果ID是手动分配的,但没有正确设置,可能导致保存失败。或者使用了某种生成策略(如IDENTITY、SEQUENCE),但数据库不支持,这时候可能在flush的时候才会报错。不过这时候应该会有异常,但可能被捕获了没有记录。 另外,Hibernate的缓存机制可能导致数据没有立即写入数据库。比如,save方法只是把对象放入Session缓存,直到事务提交或flush时才会真正执行SQL。如果事务没有提交,或者没有手动flush,数据库可能看不到变化。可以尝试在save之后调用flush,看看是否有异常,或者检查数据库是否有数据。 日志级别设置也可能隐藏了错误。可能Hibernate或底层JDBC的日志级别太高,没有输出错误信息。检查日志配置,把org.hibernate的日志级别设为DEBUG,看看是否有隐藏的异常或SQL语句。 还有可能是数据库表结构不匹配,比如字段长度、类型不符,或者约束不满足。Hibernate在生成SQL时可能没有问题,但执行时会因为约束失败而回滚,但如果没有正确捕获异常,可能看不到错误。这时候需要检查数据库表结构和实体类是否一致。 最后,可能代码中有其他地方覆盖了保存的数据,比如在save之后又有其他操作修改了对象,或者触发了回滚。需要检查整个事务范围内的代码逻辑,确认是否有冲突的操作。 总结一下,可能的解决步骤是:首先确认事务是否正确提交;检查数据库连接和配置;验证save方法是否被执行;查看日志是否有隐藏错误;检查ID生成策略和表结构;确保flush或commit被调用。可能需要逐一排查这些方面,找到具体原因。</think>在Hibernate中使用`save_hibernate_object(object)`方法未保存成功且无报错提示,可能涉及以下几个原因。请按以下步骤排查: --- ### **1. 事务未提交(最常见原因)** Hibernate的保存操作需在**事务边界内**提交才能生效。 - **声明式事务**:检查方法是否添加了`@Transactional`注解。 ```java @Transactional public void saveObject(Object object) { session.save(object); // 需事务提交后生效 } ``` - **编程式事务**:手动提交事务。 ```java Transaction tx = session.beginTransaction(); try { session.save(object); tx.commit(); // 必须显式提交 } catch (Exception e) { tx.rollback(); } ``` --- ### **2. 未触发Flush操作** Hibernate可能延迟执行SQL(缓存机制),需手动触发`flush()`或等待事务提交。 ```java session.save(object); session.flush(); // 立即同步到数据库 // 检查数据库是否写入 ``` --- ### **3. 数据库连接或配置问题** - **连接池配置错误**:如URL、用户名、密码错误,可能导致操作在提交时失败。 - **自动提交模式**:确认`hibernate.connection.autocommit`是否为`false`(默认依赖事务控制)。 --- ### **4. ID生成策略问题** 若实体类ID使用**手动分配**(如`Assigned`策略),但未显式设置ID,可能导致保存失败。 ```java object.setId(123); // 必须为ID赋值 session.save(object); ``` --- ### **5. 日志级别掩盖错误** 检查日志配置,确保Hibernate和JDBC驱动日志级别为`DEBUG`: - **Hibernate日志**:查看是否有隐藏的SQL异常。 - **配置示例(logback.xml)**: ```xml <logger name="org.hibernate" level="DEBUG"/> <logger name="java.sql" level="DEBUG"/> ``` --- ### **6. 数据库表结构不匹配** - **字段类型或长度不符**:如实体类定义`String`长度为255,但数据库字段为`VARCHAR(50)`。 - **约束冲突**:如唯一键重复,但事务回滚后未抛出异常。 --- ### **7. 代码逻辑未执行到保存方法** 通过调试或日志确认`save()`方法是否被调用: ```java System.out.println("保存方法已调用"); // 临时验证 session.save(object); ``` --- ### **8. 二级缓存或延迟写入** 若启用二级缓存(如Ehcache),数据可能未立即同步到数据库。尝试禁用缓存测试: ```properties hibernate.cache.use_second_level_cache=false ``` --- ### **排查步骤总结** 1. **确认事务提交**:检查`@Transactional`或手动提交。 2. **手动Flush**:调用`session.flush()`测试。 3. **检查日志**:查看DEBUG级别的Hibernate日志。 4. **验证ID生成策略**:确保ID已正确赋值。 5. **数据库表结构对比**:与实体类严格对齐。 6. **简化测试**:写一个最小化用例,排除其他代码干扰。 --- 通过以上步骤,可逐步定位问题根源。如果仍无法解决,建议提供更多上下文(如代码片段、配置文件和日志),以便进一步分析。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值