JPA基本类型ElementCollection在查询中计算的值

时间:2014-12-28 13:55:30

标签: jpa criteria-api jpa-2.1

考虑以下实体:

@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))

我可以不引入包装器吗?

谢谢

1 个答案:

答案 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 添加到您的查询中。