在我的实体中,我定义了一个@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%';