如何在使用Hibernate和Spring-boot时,通过JPA查询返回SUM结果?

17

我正在尝试使用JPA和JPQL查询实体并从表格中返回一列的总和(总天数)。我认为我已经正确地设置了它,但是我收到了这个错误:

Caused by: org.springframework.beans.factory.BeanCreationException:
Error creating bean with name 'myRepository':
Invocation of init method failed; nested exception is
java.lang.IllegalArgumentException: Validation failed for query for method
public abstract java.lang.Float
com.nissan.rca.repository.MyRepository.selectTotals()!

这是我的实体的表示:

@Entity
@Table(name = "TABLENAME")
@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
public class MyEntity implements Serializable {

    private static final long serialVersionUID = 1L;

    @EmbeddedId
    private MyEntityCompositeKey myEntityCompositeKey;

    @Column(name = "raiser_id")
    private String raiserID;

    @Column(name = "total_days")
    private Float totalDays;

这里是我的存储库,在其中我将查询指定给一个方法:

Translated:

这里是我的存储库,在其中我将查询指定给一个方法:

@Repository
public interface MyRepository extends JpaRepository<MyEntity, ID> {
    @Query("SELECT SUM(total_days) FROM MyEntity")
    Float selectTotals();
}

我在我的rest controller中为api映射从myRepository对象调用selectTotals()方法。

@GetMapping("/getForecastTotals")
public Float getForecastTotals() {
    return myRepository.selectTotals();
}

我不确定为什么它不能作为浮点数返回。


1
在您的查询中,您正在使用列名,请使用属性名称(totalDays),这样应该可以正常工作。 - lane.maxwell
3个回答

33

这不是一个有效的JPQL语句。

你可以使用以下语句:

@Query("SELECT SUM(m.totalDays) FROM MyEntity m")

或者,将其改为本地查询:

@Query(value = "SELECT SUM(total_days) FROM MyEntity", nativeQuery = true)


1
如果您进行本地化,请确保使用IF NULL。例如:@Query(value = "SELECT IFNULL(SUM(total_days), 0) FROM MyEntity", nativeQuery = true) - KenobiBastila
1
@KenobiBastila 对于JPQL,您可以使用COALESCE而不是IF NULL。例如:@Query(value = "SELECT COALESCE(SUM(e.total_days), 0) FROM MyEntity e") - Kovsharov

2
您可以通过映射一个新的POJO来实现这个功能。
@Repository
public interface MyRepository extends JpaRepository<MyEntity, ID> {
    @Query("SELECT new com.NewPojo(SUM(m.totalDays)) FROM MyEntity m")
    NewPojo selectTotals();
}

class NewPojo {
    Float days;
    public NewPojo(Float days) {
        this.days = days;
    }
}

1
当我在寻找我的DTO的总和解决方案时,这个解决方案对我很有帮助。new com.myDTO(recipientName, SUM(p.price))... - Lime莉茉

0

将您的JPQL更改为@Query("SELECT SUM(m.totalDays) FROM MyEntity m")


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接