gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 11:35:25 25 4
gpt4 key购买 nike

在@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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com