GVKun编程网logo

在JPA 2中,使用CriteriaQuery,如何计算结果

26

本文将分享在JPA2中,使用CriteriaQuery,如何计算结果的详细内容,此外,我们还将为大家带来关于CriteriaQuery中的子查询、CriteriaQuery在where子句中的子查询、

本文将分享在JPA 2中,使用CriteriaQuery,如何计算结果的详细内容,此外,我们还将为大家带来关于CriteriaQuery中的子查询、CriteriaQuery在where子句中的子查询、CriteriaQuery月和年过滤器、java – jpa 2 hibernate限制(最大结果)到一个CriteriaQuery的相关知识,希望对你有所帮助。

本文目录一览:

在JPA 2中,使用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中的子查询

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在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月和年过滤器

CriteriaQuery月和年过滤器

我正在尝试在一个包含带有日期的列(Oracle 11G)的模型中进行标准查询(JPA / Hibernate)。例如,我有

  1. 09年1月13日
  2. 09年1月15日
  3. 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”进行过滤,则应返回:

  1. 09年1月13日
  2. 09年1月15日

任何帮助将不胜感激,在此先感谢。

java – jpa 2 hibernate限制(最大结果)到一个CriteriaQuery

java – jpa 2 hibernate限制(最大结果)到一个CriteriaQuery

也许这是一个愚蠢的问题,但我在文档中找不到答案:
如何使用JPA2对CriteriaQuery设置限制?

谢谢

解决方法

CriteriaQuery不是可执行查询.您需要先使用EntityManager.createquery(criteriaQuery)创建一个TypedQuery.然后,您可以设置此的最大结果并执行它.

今天的关于在JPA 2中,使用CriteriaQuery,如何计算结果的分享已经结束,谢谢您的关注,如果想了解更多关于CriteriaQuery中的子查询、CriteriaQuery在where子句中的子查询、CriteriaQuery月和年过滤器、java – jpa 2 hibernate限制(最大结果)到一个CriteriaQuery的相关知识,请在本站进行查询。

本文标签: