【问题标题】:Move Query (Criteria-API) between EntityManagers在 EntityManagers 之间移动查询(Criteria-API)
【发布时间】:2018-03-16 10:37:33
【问题描述】:

我有一个从EntityManager 创建的标准。

final CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
final CriteriaQuery query = criteriaBuilder.createQuery();

我将该条件存储在 RestController 中。

现在我喜欢在 Singleton-Service 中执行查询,但出现异常:

Caused by: java.lang.IllegalStateException: Session/EntityManager is closed
at org.hibernate.internal.AbstractSharedSessionContract.checkOpen(AbstractSharedSessionContract.java:326)
at org.hibernate.engine.spi.SharedSessionContractImplementor.checkOpen(SharedSessionContractImplementor.java:126)
at org.hibernate.internal.SessionImpl.getPersistenceContext(SessionImpl.java:2234)
at org.hibernate.query.internal.AbstractProducedQuery.isReadOnly(AbstractProducedQuery.java:238)
at org.hibernate.query.internal.AbstractProducedQuery.getQueryParameters(AbstractProducedQuery.java:1249)
at org.hibernate.query.internal.AbstractProducedQuery.doList(AbstractProducedQuery.java:1404)
at org.hibernate.query.internal.AbstractProducedQuery.list(AbstractProducedQuery.java:1374)
at org.hibernate.Query.getResultList(Query.java:417)
at org.hibernate.query.criteria.internal.compile.CriteriaQueryTypeQueryAdapter.getResultList(CriteriaQueryTypeQueryAdapter.java:55)

如何合并查询到新的EntityManager?

【问题讨论】:

    标签: java sql spring criteria-api


    【解决方案1】:

    与其将您使用 EntityManager 创建的对象移动到另一个对象的上下文中,为什么不只是懒惰地创建对象呢?所以,不要这样做:

    final CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
    final CriteriaQuery query = criteriaBuilder.createQuery();
    

    改为这样做:

    Function<EntityManager, CriteriaQuery> function = em -> {
        CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
        CriteriaQuery query = criteriaBuilder.createQuery();
        ...
        return query;
    }
    

    延迟构造的查询将始终在正确的上下文中构造。

    【讨论】:

    • @PeterRader:你真的测量过这个吗?许多人纯粹基于未经验证的假设来解决这些缓存问题。如果您确实对此进行了衡量,您是否考虑过仅使用普通 SQL(存储在字符串中)然后运行本机查询?
    • @PeterRader:那么看看基准测试会非常有趣!我不知道这些问题,但我会很有趣了解它们。你写博客吗?
    猜你喜欢
    • 2019-04-10
    • 2011-12-10
    • 1970-01-01
    • 1970-01-01
    • 2011-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多