【问题标题】:JPA basic type ElementCollection computed value in query查询中的 JPA 基本类型 ElementCollection 计算值
【发布时间】: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))

我可以不引入包装器吗?

谢谢

【问题讨论】:

    标签: jpa criteria-api jpa-2.1


    【解决方案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 添加到您的查询中。

    【讨论】:

      猜你喜欢
      • 2013-01-21
      • 1970-01-01
      • 2021-02-17
      • 2018-01-13
      • 2017-05-22
      • 2012-08-19
      • 1970-01-01
      • 1970-01-01
      • 2018-05-29
      相关资源
      最近更新 更多