JPA:加入String类型的@ElementCollection并执行小写或大写检查

时间:2017-06-28 05:55:36

标签: hibernate jpa

在我的实体中,我定义了一个@ElementCollection:

@Entity
public class Test extends AbstractEntity {
    ...
    @Column(nullable = false)
    private String name;

    @ElementCollection
    private List<String> synonyms = new ArrayList<>();
    ...
}

现在我试图找到所有记录,其中名称(小写)就像给定字符串或其在同义词列表中。

到目前为止我尝试的所有东西都没有用。我的函数获取了以下可用于构建查询的对象:

public Predicate toPredicate(Root<Test> product, CriteriaQuery<?> query, CriteriaBuilder builder) {
    ...
}

我尝试了几种变体,比如

...
String lowerCaseName "test";

final Predicate namePredicate = builder.or(
    builder.and(builder.lower(product.join(Test_.synonyms)).in(Arrays.asList(lowerCaseName))),
    builder.equal(builder.lower(product.get(Test_.name)), lowerCaseName));
predicates.add(builder.and(namePredicate));
...

或进行连接并与builder.where结合但没有任何效果。 特别是使用Java String类型进行连接会让我发疯,因为我真的不知道如何访问这个值因为它没有映射名称,而在“真实”中有一个典型的实体列表。 1:n关系。 我读过我可以使用builder.isMember函数但在这种情况下我不知道如何像搜索一样小写...

有人可以帮忙吗?

我想我需要一个连接,因为我需要对每个值做一个小写,但我当然不确定......

@Edit 这或多或少是我想要产生的查询:

select * from test t 
left join test_synonyms on t.id = test_id
where lower(t.name) like '%abc%' or lower(test_synonyms.synonyms) like '%abc%';

0 个答案:

没有答案