查询中的 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 服务中的不相等查询

JPA03 -- Spring Data JPA02

JPA分页查询与条件分页查询

java JPA with Hibernate模糊查询时类型为Long型出错

JPA连接PG数据库时间类型查询报错的修改

jpa多条件查询重写Specification的toPredicate方法(转)