spring - 使用 JPA 规范无法找到多对多关系中没有实体的实体

标签 spring hibernate spring-data spring-data-jpa hibernate-criteria

我希望将此查询实现为 Spring 数据存储库的规范:

select * from Parts 
 where id not in (select partId 
                    from PartsToDeliveries
                    where deliveryId = 31)

(基本上,找到不属于某个交付的所有零件)

以下是类(class):

@Entity
public class Part {
    @Id
    private Long id;

    @ManyToMany
    @JoinTable(name = "PartsToDeliveries", joinColumns = {@JoinColumn(name = "partId")}, inverseJoinColumns = @JoinColumn(name = "deliveryId"))
    private Set<Delivery> deliveries = new HashSet<>();
}

@Entity
public class Delivery {

    @Id
    private Long id;

    @ManyToMany(mappedBy = "deliveries")
    private List<Part> parts;
}

填空:

Specification<Part> specification = (root, criteriaQuery, criteriaBuilder) ->     {
    ? _______ ?
}

我根本不知道从哪里开始。

最佳答案

Antoniossss 有正确的解决方案(该文档不是特别有帮助)。为了完整起见,这里是最终解决方案:

specification = (root, criteriaQuery, criteriaBuilder) -> {
                Subquery<Long> subquery   = criteriaQuery.subquery(Long.class);
                Root<Part>     subFrom    = subquery.from(Part.class);
                Path<Long>     deliveryId = subFrom.join("deliveries").get("id");
                subquery.select(subFrom.get("id"));
                subquery.where(criteriaBuilder.equal(deliveryId, 31l));

                Path<Long> id = root.get("id");
                return criteriaBuilder.not(criteriaBuilder.in(id).value(subquery));
            };

关于spring - 使用 JPA 规范无法找到多对多关系中没有实体的实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39645867/

相关文章:

java - 无法在 thymeleaf 中显示 byte[] 图像

java - 当 Redis 连接出现问题时,在 Hibernate 中熔断 L2 缓存

java - 使用 Hibernate 工具时出现不支持的 Major.minor 版本 51.0 异常

java - Spring 连接池问题

java - addArgumentResolver 未在配置类中调用

spring - @Autowired 在 Scala 类的构造函数上

java - 如何将 @ManyToOne 关联映射到 SQL 查询的结果

mongodb - 是否可以使用 SpringData MongoDB 存储库执行带有分页的任意查询?

具有不同参数的 Spring data JPA 查询

java - Spring Data JPA 何时实际调用数据库上的 INSERT?