我有以下实体
class A {
@Id
Integer id;
String name;
@ElementCollection
@JoinTable(name = "othername", joinColumns = @JoinColumn(name = "id_a"))
@Column(name = "name")
List<String> othernames;
}
我正在尝试使用条件API在名称或其他名称上使用中缀搜索来查找A的实例。基本上像这样的SQL-Query:
SELECT * FROM A
WHERE name like '%something%'
OR id IN (SELECT id_a FROM othername WHERE name LIKE '%something%');
以下代码旨在做正确的事:
String search = "%something%";
Subquery<Integer> subquery = c.subquery(Integer.class);
Root<A> subqueryFrom = subquery.from(A.class);
subquery.select(subqueryFrom.get(A_.id));
subquery.where(builder.like(subqueryFrom.get(A_.othernames), search));
query.where(builder.or(
builder.like(from.get(A_.name), search),
from.get(A_.id).in(subquery)
));
我在这里使用子查询,所以我没有得到重复的结果(例如,有人搜索“a”,对象的名称包含“a”,其他名称也包含“a”) 的
现在这段代码不起作用,因为subqueryFrom.get(A.othernames)返回一个Expression&lt; List&lt; String&gt;&gt;而builder.like只接受Expression&lt; String&gt;。
我实际上认为我的方法是完全错误的,但目前我想不出任何其他解决方案。
答案 0 :(得分:0)
您需要使用联接来加入集合关系。使用join()而不是get()。
此外,您不需要使用子查询,而只需将连接放在根查询中,并使用不同的。
请参阅, http://wiki.eclipse.org/EclipseLink/UserGuide/JPA/Basic_JPA_Development/Querying/Criteria#Join