java - hibernate 事务和 sql 查询与条件查询

标签 java hibernate

在@Transitional 方法中查询时遇到问题

代码如下:

@Test
@Rollback
@Transactional
public void testFindOneReportOrderWithTwoItemWithSameFnsku() throws Exception
{
    //Prepare the order
    Session session = sessionFactory.getCurrentSession();
    ReportOrder order = new ReportOrder();
    order.setId(111111);
    order.setCustomerId("test customer");

    session.persist(order);
    // session.flush();

    System.out.println("Start ====================");
    System.out.println("criteria search:");
    session = sessionFactory.getCurrentSession();
    System.out.println(session.createCriteria(ReportOrder.class).list());    


    System.out.println("sql query:");
    System.out.println(session.createSQLQuery("SELECT * FROM Orders").list());


    System.out.println("End ==========================");
}

测试是:

  1. 如果我注释第 13 行“session.flush”和第 17,18 行“条件搜索” 那么我在sql查询中将得不到结果

  2. 如果我只注释第 13 行 然后我将在标准搜索和 sql 搜索中获得所有结果

  3. 如果我不注释第 13 行 然后我将从 sql 搜索中得到结果。

我的问题是:

  1. 为什么执行条件搜索后可以得到sql搜索结果?
  2. 为什么我在 sesson.persist() 之后无法得到 sql 结果?

最佳答案

您遇到了与刷新待定数据库更新相关的问题。 Hibernate 通过在需要时不刷新对数据库的更改来进行优化。当您执行 hibernate 理解的查询时,它会根据需要刷新。问题是 hibernate 不会查看您正在执行的 SQL 并找出查询所依赖的实体,因此它不会刷新任何内容。当您使用 SQL 时,您应该使用诸如 addSynchronizedEntityClassaddSynchronizedEntityName 之类的方法来告诉 Hibernate SQL 查询涉及哪些实体。

尝试这样的事情:

session.createSQLQuery("SELECT * FROM Orders").addSynchronizedEntityClass(ReportOrder.class).list()

关于java - hibernate 事务和 sql 查询与条件查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33807489/

相关文章:

java - indexoutofboundexception : setSpan (2. ..2) 超出长度 1

java - 如何从子元素 JPA 加入

java - 使用 Mockito 控制方法输出

java - Kotlin 与列表末尾的新项目关联

java - Hibernate TransientPropertyValueException 在保存数据时

java - JPA:非唯一 "OneToMany"集合

java - sun.reflect.annotation.TypeNotPresentExceptionProxy - 在 weblogic 上部署 SOAP web 服务

java - JPA 2.1/hibernate 5 : Search on inner type of Composite User Type with criteria API

java - JPA 实体和查询的编译时检查

hibernate - 在 embeddable/embedded-id 中使用 hibernate 序列生成器