本文将分享在JPA2中,使用CriteriaQuery,如何计算结果的详细内容,此外,我们还将为大家带来关于CriteriaQuery中的子查询、CriteriaQuery在where子句中的子查询、
本文将分享在JPA 2中,使用CriteriaQuery,如何计算结果的详细内容,此外,我们还将为大家带来关于CriteriaQuery中的子查询、CriteriaQuery在where子句中的子查询、CriteriaQuery月和年过滤器、java – jpa 2 hibernate限制(最大结果)到一个CriteriaQuery的相关知识,希望对你有所帮助。
本文目录一览:- 在JPA 2中,使用CriteriaQuery,如何计算结果
- CriteriaQuery中的子查询
- CriteriaQuery在where子句中的子查询
- CriteriaQuery月和年过滤器
- java – jpa 2 hibernate限制(最大结果)到一个CriteriaQuery
在JPA 2中,使用CriteriaQuery,如何计算结果
我对JPA 2相当陌生,它是CriteriaBuilder / CriteriaQuery API:
CriteriaQuery
Java文档
CriteriaQuery
在Java EE
6教程中
我想计算一个CriteriaQuery的结果而不实际检索它们。那有可能吗,我没有找到任何这样的方法,唯一的办法就是这样做:
CriteriaBuilder cb = entityManager.getCriteriaBuilder();CriteriaQuery<MyEntity> cq = cb .createQuery(MyEntityclass);// initialize predicates herereturn entityManager.createQuery(cq).getResultList().size();
那不可能是正确的方法…
有解决方案吗?
答案1
小编典典类型查询MyEntity
将返回MyEntity
。您要查询Long
。
CriteriaBuilder qb = entityManager.getCriteriaBuilder();CriteriaQuery<Long> cq = qb.createQuery(Long.class);cq.select(qb.count(cq.from(MyEntity.class)));cq.where(/*your stuff*/);return entityManager.createQuery(cq).getSingleResult();
显然,您将希望使用示例中跳过的任何限制和分组等来构建表达式。
CriteriaQuery中的子查询
首先,设置正确的类型:
CriteriaBuilder cb = em.getCriteriaBuilder();
//CriteriaQuery<Role> cq = cb.createQuery(Role.class);
//The type of the data returned in multiselect.
CriteriaQuery<String> cq = cb.createQuery(String.class);
Root<User> root = cq.from(User.class);
//Add to compare
Join<User,Role> joinRole = root.join(User_.roles,JoinType.Inner);
//The type of the data returned in select.
//Subquery subquery = cq.subquery(Role.class);
Subquery<Long> subquery = cq.subquery(Long.class);
//Root subfrom = subquery.from(Role.class);
//We set the data type in the Root
Root<Role> subfrom = subquery.from(Role.class);
subquery.select(subfrom.get(Role_.id));
subquery.where(cb.equal(subfrom.get(Role_.id),role.getId()));
cq.multiselect(root.get(User_.abbreviation));
//cq.where(cb.equal(root.get(User_.id),subquery));
//To use in the where subquery,call the getSelection () method
cq.where(cb.equal(root.get(User_.id),subquery.getSelection()));
query = em.createQuery(cq);
return query.getResultList();
此外,主查询所在的位置不是等于,请对此进行更改
cq.where(cb.equal(root.get(User_.id),subquery.getSelection()));
以此
cq.where(joinRole.get(Role_.id).in(subquery.getSelection()));
,
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Role> cq = cb.createQuery(Role.class);
Root<User> root = cq.from(User.class);
Subquery<Long> subquery = cq.subquery(Long.class);
Root<Role> subqueryRoot = subquery.from(Role.class);
Predicate subqueryPredicate =
cb.equal(subqueryRoot.get(Role_.id),role.getId());
//!!! I suspect here you have to select USER_ID,but Role entity does not contain such field
subquery.select(subqueryRoot.get(Role_.id))
.where(subqueryPredicate);
Predicate queryPredicate = cb.in(root.get(User_.id)).value(subquery);
cq.multiselect(root.get(User_.abbreviation)).where(queryPredicate);
CriteriaQuery在where子句中的子查询
如何解决CriteriaQuery在where子句中的子查询?
尝试类似以下示例的操作来创建子查询:
CriteriaQuery<Object[]> cq = cb.createquery(Object[].class);
Root tableA = cq.from(TableA.class);
Subquery<String> sq = cq.subquery(TableB.class);
Root tableB = cq.from(TableB.class);
sq.select(tableB.get("d"));
sq.where(cb.equal(tableB.get("id"), 3));
cq.multiselect(
cb.get("a"),
cb.get("b"),
cb.get("c"));
cq.where(cb.equal(tableA.get("a"), sq));
List<Object[]> = em.createquery(cq).getResultList();
请注意,由于附近缺少IDE,因此该代码尚未经过测试。
解决方法
谁能给我一些关于如何将这种子查询放入提示CriteriaQuery
?(我正在使用 JPA 2.0 - Hibernate 4.x )
SELECT a,b,c FROM tableA WHERE a = (SELECT d FROM tableB WHERE tableB.id =
3)
-第二个选择将始终获得单个结果或null。
CriteriaQuery月和年过滤器
我正在尝试在一个包含带有日期的列(Oracle 11G)的模型中进行标准查询(JPA / Hibernate)。例如,我有
- 09年1月13日
- 09年1月15日
- 09年3月16日
我的功能就像:
public MyEntity getEntitiesFromCertainFilters(int a,int b,java.util.date c)
{
CriteriaBuilder builder = entityManager.getCriteriaBuilder();
CriteriaQuery< MyEntity > query = builder.createQuery(MyEntity.class);
Root< MyEntity > root = query.from(MyEntity.class);
query.select(root).where (
builder.equal ( root.get ( "id" ).get ( "codEstablec" ),establecimiento),builder.equal ( root.get ( "id" ).get ( "correlGrupo" ),correlGrupo),//HERE I NEED TO ADD FILTER BY C.MONTH AND C.YEAR FROM THE DATE ATTRIBUTE
);
List < MyEntity > resultList = entityManager.createQuery(query).getResultList();
return resultList.get(0);
}
如果我想按c =“ 01-JAN-09”进行过滤,则应返回:
- 09年1月13日
- 09年1月15日
任何帮助将不胜感激,在此先感谢。
java – jpa 2 hibernate限制(最大结果)到一个CriteriaQuery
如何使用JPA2对CriteriaQuery设置限制?
谢谢
解决方法
今天的关于在JPA 2中,使用CriteriaQuery,如何计算结果的分享已经结束,谢谢您的关注,如果想了解更多关于CriteriaQuery中的子查询、CriteriaQuery在where子句中的子查询、CriteriaQuery月和年过滤器、java – jpa 2 hibernate限制(最大结果)到一个CriteriaQuery的相关知识,请在本站进行查询。
本文标签: