JPA 2 条件查询,在 属性 列表 class 上
JPA 2 criteria query, where on property list class
我想使用条件类型查询实现以下查询:
SELECT
a.*
FROM
table_a a
INNER JOIN table_b b ON a.id= b.id
WHERE
b.url = 'value.org';
条件查询:
final CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
final CriteriaQuery<A> criteriaQuery = criteriaBuilder.createQuery(A.class);
final Root<A> root = criteriaQuery.from(A.class);
root.fetch(A.domains); // domains is a List<B>
criteriaQuery
.select(root);
实体A:
@OneToMany
List<B> domains;
实体 B:
@Column(name="URL")
String url;
我的问题是如何重现,我试过类似的方法:
.where(criteriaBuilder.equal(root.get(A.domains).. ??))
但我不知道如何继续,因为提案条款是 as()、in(..) 等..
有什么提示吗?
首先,您不需要获取,因为您只想获取一个。
其次,你几乎不错唯一重要的缺失部分是 join
。
这是适合您的代码:
public A loadAForValueOrg() {
CriteriaBuilder builder = entityManager.getCriteriaBuilder();
CriteriaQuery<A> query = builder.createQuery(A.class);
Root<A> a = query.from(A.class);
Join<A, B> b = a.join("domains");
query.select(A);
query.where(builder.equal(b.get("url"), "'value.org'"));
TypedQuery<A> typedQuery = entityManager.createQuery(query);
typedQuery.setMaxResults(1);
List<A> result = typedQuery.getResultList();
return result.isEmpty() ? null : result.get(0);
}
几个注意事项:
setMaxResults
不是必需的,只是提高性能的好习惯
- 如果没有结果,我们 return
null
所以它是 Java 8 Optional
的良好候选者
- 我还建议使用 metamodel 不对字符串进行操作(它容易出错)
我想使用条件类型查询实现以下查询:
SELECT
a.*
FROM
table_a a
INNER JOIN table_b b ON a.id= b.id
WHERE
b.url = 'value.org';
条件查询:
final CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
final CriteriaQuery<A> criteriaQuery = criteriaBuilder.createQuery(A.class);
final Root<A> root = criteriaQuery.from(A.class);
root.fetch(A.domains); // domains is a List<B>
criteriaQuery
.select(root);
实体A:
@OneToMany
List<B> domains;
实体 B:
@Column(name="URL")
String url;
我的问题是如何重现,我试过类似的方法:
.where(criteriaBuilder.equal(root.get(A.domains).. ??))
但我不知道如何继续,因为提案条款是 as()、in(..) 等..
有什么提示吗?
首先,您不需要获取,因为您只想获取一个。
其次,你几乎不错唯一重要的缺失部分是 join
。
这是适合您的代码:
public A loadAForValueOrg() {
CriteriaBuilder builder = entityManager.getCriteriaBuilder();
CriteriaQuery<A> query = builder.createQuery(A.class);
Root<A> a = query.from(A.class);
Join<A, B> b = a.join("domains");
query.select(A);
query.where(builder.equal(b.get("url"), "'value.org'"));
TypedQuery<A> typedQuery = entityManager.createQuery(query);
typedQuery.setMaxResults(1);
List<A> result = typedQuery.getResultList();
return result.isEmpty() ? null : result.get(0);
}
几个注意事项:
setMaxResults
不是必需的,只是提高性能的好习惯- 如果没有结果,我们 return
null
所以它是 Java 8Optional
的良好候选者
- 我还建议使用 metamodel 不对字符串进行操作(它容易出错)