有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java在Hibernate中执行条件查询后,是否需要提交/关闭会话?

我有一个如下代码:

Session session = MySessionFactory.createSession();
session.beginTransaction();
Criteria cq = session.createCriteria(clazz);
// Do stuff.
List list = cq.list();
session.getTransaction().commit();
session.close();

我真的需要beginTransaction()、commit()和close()吗

我在JPA中听说,CriteriaQuery(与Criteria相反)不需要主动事务管理


共 (1) 个答案

  1. # 1 楼答案

    >;我在JPA中听说,CriteriaQuery(与Criteria相反)不需要主动事务管理

    没错

    如果您将代码更改为标准JPA,则在事务中不会强制运行任何查询,前提是您正在选择实体(并且没有插入/更新/删除),并且没有对查询设置锁定模式

    如果这是所需的JPQL:

    SELECT c
    FROM Customer c JOIN c.orders o JOIN o.lineItems i
    WHERE i.product.productType = 'printer'
    

    标准JPA标准查询代码为:

    CriteriaBuilder cb = entityManager.getCriteriaBuilder();
    CriteriaQuery<Customer> cq = cb.createQuery(Customer.class);
    Root<Customer> customer = cq.from(Customer.class);
    Join<Customer, Order> order = customer.join(Customer_.orders); // or .join("orders")
    Join<Order, Item> item = order.join(Order_.lineItems);         // or .join("lineItems")
    
    ParameterExpression<String> p = cb.parameter(String.class, "prodType");
    cq.select(customer)
      .where(cb.equal(item.get(Item_.product).get(Product_.productType), p));
    // if you haven't generated JPA metamodel Customer_, Product_, etc, 
    // can replace this with 
    //  .where(cb.equal(item.get("product").get("productType"), p));
    
    
    TypedQuery<Employee> tq = em.createQuery(cq);
    q.setParameter("prodType", "printer");
    return q.getResultList();
    

    它有点难看,但它是强类型的(JPQL不是),标准的,面向对象的,在初始化时编译,因此速度很快。 :-)