如何解决Java Spring 规范嵌套连接条件
我试图根据最深级别的字段值获取实体列表及其关系。本机 sql 查询本身似乎很简单,但我无法使用 JPQL 或规范进行过滤。
我的表的结构是 Ad -> SubmittedValue -> Configuration
,我希望能够通过名为 Configuration
的 isspecial
实体内的字段进行过滤。
我目前有:
@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);
以及下面写的规范。它们都正确返回了实体,但排除 SubmittedValues
的 isspecial
的 configuration
值是 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 举报,一经查实,本站将立刻删除。