微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Java Spring 规范嵌套连接条件

如何解决Java Spring 规范嵌套连接条件

我试图根据最深级别的字段值获取实体列表及其关系。本机 sql 查询本身似乎很简单,但我无法使用 JPQL 或规范进行过滤。 我的表的结构是 Ad -> SubmittedValue -> Configuration,我希望能够通过名为 Configurationisspecial 实体内的字段进行过滤。 我目前有:

@Entity
public class Ad extends BaseEntity{
    @JoinColumn(name = "user_id")
    private User user;
    @OnetoMany(mappedBy = "ad")
    private List<SubmittedValue> values;
}

@Entity
/* @ToString and @EqualAndHashCode exclude "ad" */
public class SubmittedValue extends BaseEntity{
    @ManyToOne
    @JoinColumn(name = "ad_id")
    private Ad ad;
    @ManyToOne
    @JoinColumn(name = "configuration_id")
    private Configuration configuration;
    }

@Entity
public class Configuration extends BaseEntity{
    private Boolean isspecial = false;
}

到目前为止我已经尝试过使用 JPQL:

@Query("select a from Ad a inner join a.values as v inner join v.configuration as c on c.isspecial = true where a.user.id =?1")
Page<Ad> findAllBySpecialConfiguration(Pageable page,Long userId);

以及下面写的规范。它们都正确返回了实体,但排除 SubmittedValuesisspecialconfiguration 值是 false 没有应用于结果。 这是我的规格:

public static Specification<Ad> adSpecial(Long userId) {
    return (root,query,criteriaBuilder) -> {
      ListJoin<Ad,SubmittedValue> values = root.join(Ad_.values);
      Join<SubmittedValue,Configuration> config = values.join(SubmittedValue_.configuration);
      // config.on(criteriaBuilder.isTrue(config.get(Configuration_.isspecial).as(Boolean.class)));
      List<Predicate> conditions = new ArrayList<>();
      conditions.add(criteriaBuilder.isTrue(config.get(Configuration_.isspecial).as(Boolean.class)));
      conditions.add(criteriaBuilder.equal(root.get(Ad_.user).get(User_.id).as(Long.class),userId));
      return criteriaBuilder.and(conditions.toArray(new Predicate[0]));
    };
  }

谢谢和问候!

解决方法

您必须更改规范中的行

ListJoin<Ad,SubmittedValue> values = root.join(Ad_.values);

ListJoin<Ad,SubmittedValue> values = root.joinList(Ad_.values);

您可以通过将 isSpecial 作为这样的参数值来使您的规范更加动态

public static Specification<Ad> adSpecial(Long userId,Boolean isSpecial) {
    return (root,query,criteriaBuilder) -> {
        ListJoin<Ad,SubmittedValue> values = root.joinList("values");

        List<Predicate> conditions = new ArrayList<>();
        conditions.add(criteriaBuilder.equal(values.get("configuration").get("isSpecial"),isSpecial));
        conditions.add(criteriaBuilder.equal(root.get("user").get("id"),userId));

        return criteriaBuilder.and(conditions.toArray(new Predicate[0]));
    };
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。