Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/368.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 标准API和JPA2 GroupBy发行日期_Java_Hibernate_Postgresql_Jpa_Criteria - Fatal编程技术网

Java 标准API和JPA2 GroupBy发行日期

Java 标准API和JPA2 GroupBy发行日期,java,hibernate,postgresql,jpa,criteria,Java,Hibernate,Postgresql,Jpa,Criteria,我正在编写一个查询,以从实体表中查找特定日期的日期及其计数,并遇到groupBy语句的问题 以下是我的API调用标准: CriteriaBuilder criteriaBuilder = em.getCriteriaBuilder(); CriteriaQuery<Tuple> criteriaQuery = criteriaBuilder.createTupleQuery(); Root<HtEntity> from = criteriaQuer

我正在编写一个查询,以从实体表中查找特定日期的日期及其计数,并遇到groupBy语句的问题

以下是我的API调用标准:

    CriteriaBuilder criteriaBuilder = em.getCriteriaBuilder();
    CriteriaQuery<Tuple> criteriaQuery = criteriaBuilder.createTupleQuery();
    Root<HtEntity> from = criteriaQuery.from(entityClassType);

    Expression<String> log_date = criteriaBuilder.function("TO_CHAR",
            String.class, from.get(Constants.PARAM_DATE), criteriaBuilder.literal("yyyy-MM-dd")
    );

    //create the select statement
    criteriaQuery.select(
            criteriaBuilder.tuple(
                    log_date.alias("log_date"),
                    criteriaBuilder.count(from)));

    criteriaQuery.groupBy(log_date); //ISSUE HERE!!!

    TypedQuery<Tuple> query = em.createQuery(criteriaQuery);
    List<Tuple> results = query.getResultList();

请让我知道我做错了什么。相应的Postgres SQL查询应该可以解决这个问题,因为我可以对它进行测试,看看它是否可以工作。

CriteriaApi有一个很好的方法让我头疼,但不久前我确实找到了解决方案,为未来好奇的人们提供了答案:

CriteriaBuilder criteriaBuilder = em.getCriteriaBuilder();
CriteriaQuery<Object[]> criteriaQuery = criteriaBuilder.createQuery(Object[].class);
Root<MyEntity> from = criteriaQuery.from(classType);

criteriaQuery.multiselect(
    from.get("date").as(java.sql.Date.class),
    criteriaBuilder.count(from)
);

/*Add order by and group by clause*/
criteriaQuery.orderBy(criteriaBuilder.desc(from.get("date").as(java.sql.Date.class)));
criteriaQuery.groupBy(from.get("date").as(java.sql.Date.class));

TypedQuery<Object[]> query = em.createQuery(criteriaQuery);
List<Object[]> results = query.getResultList();
您会注意到,我正在将multi-select语句中的列和groupBy转换为java.sql.Date类型。CriteriaApi具有严格的类型安全格式,因此,如果要聚合特定列,则不能混合groupBy和select语句的类型。我的问题是,我正在使用函数调用选择日期列,并试图将其应用于groupBy

虽然生成的查询语句通过命令行工作,但它不适用于CriteriaApi。它无法生成ResultSet的原因是因为它假设groupBy中的投影和聚合不是我认为的同一类型,因此,如果需要在select语句中的某列上使用函数并在该列上进行聚合,则需要考虑一种避免使用我所做的函数的方法,或者使用您拥有的Hibernate EntityManager对象生成本机查询


这是不幸的,但我相信CriteriaApi有很多限制,这是其中之一。它可能应该作为一个bug提交给他们的团队,但我不确定该在哪里执行此操作。

CriteriaApi有一个让我头疼的好方法,但我确实在不久前找到了解决方案,为未来好奇的人们提供了答案:

CriteriaBuilder criteriaBuilder = em.getCriteriaBuilder();
CriteriaQuery<Object[]> criteriaQuery = criteriaBuilder.createQuery(Object[].class);
Root<MyEntity> from = criteriaQuery.from(classType);

criteriaQuery.multiselect(
    from.get("date").as(java.sql.Date.class),
    criteriaBuilder.count(from)
);

/*Add order by and group by clause*/
criteriaQuery.orderBy(criteriaBuilder.desc(from.get("date").as(java.sql.Date.class)));
criteriaQuery.groupBy(from.get("date").as(java.sql.Date.class));

TypedQuery<Object[]> query = em.createQuery(criteriaQuery);
List<Object[]> results = query.getResultList();
您会注意到,我正在将multi-select语句中的列和groupBy转换为java.sql.Date类型。CriteriaApi具有严格的类型安全格式,因此,如果要聚合特定列,则不能混合groupBy和select语句的类型。我的问题是,我正在使用函数调用选择日期列,并试图将其应用于groupBy

虽然生成的查询语句通过命令行工作,但它不适用于CriteriaApi。它无法生成ResultSet的原因是因为它假设groupBy中的投影和聚合不是我认为的同一类型,因此,如果需要在select语句中的某列上使用函数并在该列上进行聚合,则需要考虑一种避免使用我所做的函数的方法,或者使用您拥有的Hibernate EntityManager对象生成本机查询


这是不幸的,但我相信CriteriaApi有很多限制,这是其中之一。它可能应该作为一个bug提交给他们的团队,但我不确定在哪里做这件事。

老问题,但这个问题仍然相关。我试过你的解决办法,但对我无效。起作用的是trunc函数,而不是to_char:


看起来criteriabuilder不喜欢groupBy中的文字。

旧问题,但该问题仍然相关。我试过你的解决办法,但对我无效。起作用的是trunc函数,而不是to_char:


看起来criteriabuilder不喜欢groupBy中的文字。

嘿,你找到解决方案了吗?是的,我将添加一个答案以显示解决方案嘿,你找到解决方案了吗?是的,我将添加一个答案以显示解决方案
    Path<FeedbackType> feedbackTypePath = itemRoot.get("feedbackType");
    final Expression date = criteriaBuilder.function("trunc", java.sql.Date.class, votesJoin.get("creationDate"));

    selects.add(feedbackTypePath);
    selects.add(date);
    selects.add(criteriaBuilder.count(itemRoot.get("id")));

    criteriaQuery.multiselect(selects);
    criteriaQuery.where(criteriaBuilder.equal(votesJoin.get("creationDate"), oldestVoteSubquery));
    criteriaQuery.groupBy(feedbackTypePath, date);