查询中的 JPA 基本类型 ElementCollection 计算值
Posted
技术标签:
【中文标题】查询中的 JPA 基本类型 ElementCollection 计算值【英文标题】:JPA basic type ElementCollection computed value in query 【发布时间】:2014-12-28 13:55:29 【问题描述】:考虑以下实体:
@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 (?values)”实现 JPA 标准 where 子句
到目前为止我有:
root.joinSet(Parent_.values, JoinType.LEFT).in(collectionOfValues)
如何为 values 中的每个元素应用 UPPER 函数?
我知道我可以通过将 String 值定义和包装为 @Embeddable 类来实现这一点,这将为我提供 value 属性的元属性,我可以这样做:
joinSet = root.joinSet(Parent_.values, JoinType.LEFT);
criteriaBuilder.isMember(criteriaBuilder.upper(joinSet.get(WrapedString_.value)),criteriaBuilder.literal(collectionOfValues))
我可以不引入包装器吗?
谢谢
【问题讨论】:
【参考方案1】:如果有人感兴趣:
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 添加到您的查询中。
【讨论】:
以上是关于查询中的 JPA 基本类型 ElementCollection 计算值的主要内容,如果未能解决你的问题,请参考以下文章
Spring Boot REST/JPA 服务中的不相等查询