我有以下實體JPA 2個標準與@ElementCollection API和喜歡
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查詢:
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)返回表達式<名單<字符串>>而builder.like只接受表達< String>終止。
我實際上認爲我的方法是完全錯誤的,但目前我想不出任何其他解決方案。