【问题标题】:JPA 2 criteria API with @ElementCollection and likeJPA 2 标准 API 与 @ElementCollection 等
【发布时间】:2012-09-18 10:30:38
【问题描述】:

我有以下实体

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) 返回一个 Expression> 而 builder.like 只接受 Expression

我其实认为我的做法是完全错误的,但目前我想不出任何其他的解决方案。

【问题讨论】:

    标签: jpa jpa-2.0 criteria-api


    【解决方案1】:

    您需要使用 join 来加入集合关系。使用 join(),而不是 get()。

    另外,您不需要使用子查询,只需将连接放在根查询中,并使用 distinct。

    看, http://wiki.eclipse.org/EclipseLink/UserGuide/JPA/Basic_JPA_Development/Querying/Criteria#Join

    http://wiki.eclipse.org/EclipseLink/UserGuide/JPA/Basic_JPA_Development/Querying/Criteria#CriteriaQuery

    【讨论】:

      猜你喜欢
      • 2016-11-18
      • 1970-01-01
      • 1970-01-01
      • 2018-02-24
      • 1970-01-01
      • 1970-01-01
      • 2013-06-13
      • 2017-04-18
      • 1970-01-01
      相关资源
      最近更新 更多