java - 当使用表示对象集合的字段时,如何使用过滤表达式创建规范?

标签 java hibernate jpa orm criteria

我有下一个实体:

附件:

@Data
@ToString
@Entity
@EqualsAndHashCode
@Accessors(chain = true)
public class Attachment {
   private Long id;
   private String attachmentName;
   private String code;
}

文档:

@Data
@ToString
@Entity
@EqualsAndHashCode
@Accessors(chain = true)
public class Document{
   private Long id;
   private String documentName;

   @LazyCollection(LazyCollectionOption.FALSE)
   @OrderBy
   @OneToMany(mappedBy = "...", orphanRemoval = true, cascade = CascadeType.ALL)
   private List<Attachment> attachments = new ArrayList<>();
}

我需要构建规范(我应该仅使用规范,因为文档服务是由第三方编写的,并且需要规范作为参数),其中必须包含按附件名称进行过滤。它应该看起来像这样:

public class DocumentPredicate {
   public Specification<Document> getPredicate(String attachmentFilteringName) {
      Specifications<T> result = Specifications.where(AnotherSpecification);

      if (attachmentFilteringName != null) {
            result = result.and((root, query, cb) ->
                    cb.equal(root.get("attachments"), attachmentFilteringName));
      }
   }

}

我尝试了很多解决方案,但都无法解决此任务。 主要问题是:

  1. 我不能做类似的事情:root.get("attachments").get("0"),即我不能在谓词中使用列表元素。当然,因为我有异常(exception)。
  2. 我无法使用 cb.in(),因为我只有 AttachmentFileName,并且没有其他字段可供附件 equals 方法正常工作。

最佳答案

if (attachmentFilteringName != null) { 结果 = 结果.and((根, 查询, cb) -> cb.equal(root.join("attachments").get("attachmentName"),attachmentFilteringName)); }

关于java - 当使用表示对象集合的字段时,如何使用过滤表达式创建规范?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57869368/

相关文章:

java - Python 中可用处理器的数量

java数据结构保存许多整数数组及其标签

墙内的Java迷宫并获得所有可能的路径

java - 获取数据库大小 Java(JPA)

java - 缓存不一致 - 实体并不总是保留在缓存的集合中

java - 获取与切入点相交的类的名称

java - Hibernate sessionFactory.getCurrentSession() 与 Spring 一起使用时

java - 名为 'userService' 的 Bean 预期类型为 'demo.spring.orm.userService.UserService',但实际上类型为 'com.sun.proxy.$Proxy20'

java - Spring 集成测试环境不调度 JPA 实体生命周期事件

java - hibernate 和 jpa 怪异;意外的懒惰获取