考虑以下实体:
@Entity
public class Parent{
@Column
private String name;
@ElementCollection
@CollectionTable(name="REF_TABLE",joinColumns=@JoinColumn(name="REF_COLUMN_ID"))
@Column(name="REF_COLUMN_VALUE")
public Set<String> getValues() {
return values;
}
}
我需要为“UPPER(REF_COLUMN_VALUE)IN(?值)”实现JPA条件where子句
到目前为止,我有:
root.joinSet(Parent_.values, JoinType.LEFT).in(collectionOfValues)
如何为值中的每个元素应用UPPER函数?
我知道我可以通过将String值定义并包装为@Embeddable类来实现这一点,这将为value属性提供meta属性,我可以这样做:
joinSet = root.joinSet(Parent_.values, JoinType.LEFT);
criteriaBuilder.isMember(criteriaBuilder.upper(joinSet.get(WrapedString_.value)),criteriaBuilder.literal(collectionOfValues))
我可以不引入包装器吗?
谢谢
答案 0 :(得分:0)
如果有人对此感兴趣:
SetJoin<Object, Object> setJoin = root.joinSet(Parent_.values.getName(), JoinType.LEFT);
CriteriaBuilder.In<String> in = criteriaBuilder.in(criteriaBuilder.upper(setJoin.as(String.class)));
for(String v:collectionOfValues){
in.value(v.toUpperCase());
}
在使用LEFT_JOIN时,不要忘记将 distinct 添加到您的查询中。