当前位置: 首页 > 知识库问答 >
问题:

如何使用JPA的标准API构造多列“where…in”表达式?

萧晓博
2023-03-14
    public void persistUnique(List<CdrEntity> cdrs) {
        // find all the CDRs in the collection that are already in the DB
        CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
        CriteriaQuery<CdrEntity> query = criteriaBuilder.createQuery(CdrEntity.class);
        Root<CdrEntity> cdrRoot = query.from(CdrEntity.class);
        query.select(cdrRoot).where(cdrRoot.in(cdrs));
        List<CdrEntity> nonUnique = entityManager.createQuery(query).getResultList();
        // remove nonUnique elements from crds and persist
        ...
    }
[EL Fine]: sql:...--SELECT SUBINDEX, ... FROM CDRS WHERE ((?, ?, ?, ?) IN ((?, ?, ?, ?), (?, ?, ?, ?), ...))
bind => [null, null, null, null, 2, 1362400759, 19415, 176, ...]

但是,直接在上调用.in(...)似乎没有得到所需的结果。如果直接使用实体是不可能的,我希望有某种表达式可以表示多个列,然后这些列可以作为调用.(...)的接收方,但我没有找到任何。

那么,问题是:一个人如何正确地做到这一点呢?还是在JPA中根本不可能?或者只是Eclipselink中存在一个bug?

共有1个答案

贺乐意
2023-03-14

有趣的尝试,以及生成的奇怪的SQL,SQL看起来左侧正确,但右侧不正确。请记录一个bug,这是一个可以支持的东西。(也可以在2.5开发版本中尝试一下,它可能会起作用)。

JPA Criteria API不支持嵌套数组,因此这超出了JPA规范的范围。

您可以为左侧的id字段创建一个路径表达式列表,并为此使用CriteriaBuilder literal()表达式,它可能会起作用。

 类似资料:
  • 带有“in”表达式的JPA标准API转换为多个“OR”而不是“in” e. g. 我的主要模型 多对一关系 在持久性中定义了这两个模型。xml(注意:它没有指定任何db方言) 以下是用于构建查询的带条件API的代码: 这将以以下格式打印查询: 但我应该得到的是 环境: 托梅7.0.3 嵌入式OpenJPA Mariadb 更新: 我也试着添加如下mariadb方言,但没有帮助

  • 我在两个实体< code>A和< code>B之间有< code>@ManyToMany关系,所以Hibernate在数据库中为我创建了一个名为< code>A_B的未映射表,我在java代码中没有相关的实体。此外,我试图使用Criteria API从我的dao中查询那个< code>A_B表。有人能帮我想出一个解决办法吗?我正尝试在< code>Criteria API中做一些类似这个例子的事情

  • 主要内容:标准WHERE示例WHERE子句用于对数据库应用条件并基于该条件获取数据。 在Criteria API中,AbstractQuery接口的)方法用于设置查询条件。 标准WHERE示例 在这里,我们将在表上执行多个操作。假设该表包含以下记录 - 现在,请按照以下步骤执行操作: - 第1步: 创建一个实体类。在包下创建了类文件。 该类包含三个属性:,,以及所有必需的注解。 文件:StudentEntity.java -

  • 此查询用于检索一对多关系中的最后记录(请参阅SQL连接:选择一对多关系中的最后记录) 我的问题是:如何使用jpa criteria api使用subselect构建这个连接?可能吗?如果没有,可以使用jpql吗? 到目前为止我的代码:

  • 尝试编写一个标准api查询。 应该作为参数传递,并且可以更改。我在代码中添加了实体。 感谢任何帮助或指导。 这就是我目前的情况: 我现在能够获取正确的数据,但列表没有排序。这是我在日志中看到的,生成了两个查询,一个有顺序,另一个没有顺序。

  • 两个数据库表具有外键关系。 它们通过JPA映射到两个实体A和B,但是连接列是从实体中手动删除的,因此在JPA世界中,类A和B是不相关的,您不能通过字段/属性从一个类导航到另一个类。 使用JPA标准API,是否可以创建连接两个表的查询? 我在互联网上找到的所有示例都使用join列来实现目标,但如上所述,它已从代码中删除,因为大多数时候我对A和B之间的关系不感兴趣,而且我担心可能的开销。