CriteriaBuilder.size和Hibernate的@Where注释

问题描述

我有以下设置:

@Entity
public class Function {
  private String name;

  @OnetoMany(mappedBy = "function",cascade = CascadeType.ALL,orphanRemoval = true)
  @Where(clause = "type = 'In'") // <=== seems to cause problems for CriteriaBuilder::size
  private Set<Parameter> inParameters = new HashSet<>();

  @OnetoMany(mappedBy = "function",orphanRemoval = true)
  @Where(clause = "type = 'Out'") // <=== seems to cause problems for CriteriaBuilder::size
  private Set<Parameter> outParameters = new HashSet<>();
}

@Entity
public class Parameter {
  private String name;

  @Enumerated(EnumType.STRING)
  private ParameterType type;

  @ManyToOne(fetch = FetchType.LAZY,optional = false)
  @JoinColumn(name = "function_id")
  private Function function;
}

我要解决的总体问题是找到具有outParameter且具有确切动态名称集的所有函数查找名称正确为outParameter的{​​{1}} s的所有函数

这在sql中似乎是一个exact relational division”问题,因此可能会有更好的解决方案,但是我这样做的方式是这样的:

('outParam1','outParam2')

我遇到的问题是List<String> paramNames = ... Root<Function> func = criteria.from(Function.class); Path outParams = func.get("outParameters"); Path paramName = func.join("outParameters").get("name"); ... // CriteriaBuilder Code builder.and( builder.or(paramNames.stream().map(name -> builder.like(builder.lower(paramName),builder.literal(name))).toArray(Predicate[]::new)),builder.equal(builder.size(outParams),paramNames.size())); 似乎没有考虑到builder.size()注释。因为“ CriteriaBuilder代码”嵌套在适用于任何类型的实体的通用@Where中,所以我不能简单地添加Specification子句。

代码一个函数具有0个输入参数时起作用,但在有多个输入参数时不起作用。我查看了生成sql,发现它丢失了:

query.where()

任何帮助表示赞赏(或者通过其他方法解决问题,或者通过变通方法解决SELECT disTINCT function0_.id AS id1_37_,function0_.name AS name4_37_,FROM functions function0_ LEFT OUTER JOIN parameters outparamet2_ ON function0_.id = outparamet2_.function_id AND (outparamet2_.type = 'Out') -- <== where clause added here WHERE (lower(outparamet2_.name) LIKE lower(?) OR lower(outparamet2_.name) LIKE lower(?)) AND ( SELECT count(outparamet4_.function_id) FROM parameters outparamet4_ WHERE function0_.id = outparamet4_.function_id) = 2 -- <== where clause NOT added here 无法正常工作。

解决方法

where注释在函数实体中,在子查询中您尚未使用该实体,因此操作是正确的,请尝试将函数实体用作子查询的根,或手动实现where。

对于下一个,建议您在答案中包含完整的Criteria API代码。