【问题标题】:how can use count in sprig-data如何在 spring-data 中使用 count
【发布时间】:2016-10-31 08:36:54
【问题描述】:

想象一下这个情景,我有一个班级:

public class TOTO{

    private int Id;
    private Boolean bool1;
    private Boolean bool2;
    private Boolean name;

    //constructor
    //getters
    //setters

}

我还有一个 spring 数据存储库:

public interface TOTORepository extends JpaRepository<TOTO, Long> {

    @Query( "SELECT COUNT(*),toto from TOTO toto where toto.bool1=false groub by name " )
    List<TOTO> getIncidentDepart();

}

我想要得到的结果是:按名称分组的对象数。另一个问题,我可以将 COUNT(*) 变量存储在底层。

【问题讨论】:

  • 有什么问题?
  • 对象TOTO没有可以存储计数的字段
  • @imsiimsi 你能检查我的答案吗?
  • 一般情况下,如果可能的话最好让 Spring Data 生成查询。在这种情况下,您的问题是您试图返回两个不同的结果,这根本不是 Java 的工作方式。要么将计数和主选择分开到不同的查询中,要么使用list.size()

标签: java spring controller spring-data spring-data-jpa


【解决方案1】:

您需要创建一个单独的 bean 类 (TOTOGroupingByNameData),并且需要从 @Query 填充它以获得如下结果:

TOTOGroupingByNameData Bean 类:

public class TOTOGroupingByNameData {
  private String name;
  private Long   count;

  public TOTOGroupingByNameData(String name, Long count) {
    this.name = name;
    this.count  = count;
  }
}

存储库界面:

public interface TOTORepository extends JpaRepository<TOTO, Long> {

   @Query(value = "select new TOTOGroupingByNameData(t.name, count(t)) from TOTO t where where t.bool1=false group by t.name")
   List<TOTOGroupingByNameData> findCountByName();

}

P.S:假设名称为String 类型,如果您的问题中的boolean 更改为boolean 类型。

【讨论】:

    【解决方案2】:

    您可以在 TOTO 类中使用自定义构造函数并添加一个 Transient 字段来存储计数结果。

    例如,您的 TOTO 课程将是:

    public class TOTO{
    
        private int Id;
        private Boolean bool1;
        private Boolean bool2;
        private Boolean name;
    
        @Transient
        private Long totalNumber;
    
       // constructor you will use in your query
        public TOTO(int Id, Boolean bool1, Boolean bool2, Boolean name, Long totalNumber){
           this.Id = Id;
           this.bool1 = bool1;
           this.bool2 = bool2;
           this.name = name;
           this.totalNumber = totalNumber;
       }
    
        //getters
        //setters
    
    }
    

    查询会是这样的:

    @Query( "SELECT new package.to.Toto(toto.id, toto.bool1, toto.bool2, toto.name, count(*) as totalNumber) from TOTO toto where toto.bool1=false groub by toto.name " )
        List<TOTO> getIncidentDepart();
    

    使用这种方法,请记住在实例化构造函数时将包写入 TODO 类。

    【讨论】:

    • 谢谢你的回答......但我必须写新的package.to.Toto......
    • 是的,您必须指定班级所在的位置。我知道这不是最优雅的解决方案,但这样你就可以为所欲为!我经常用它来处理复杂的查询,用spring jpa不容易处理。
    • 引起:java.lang.IllegalArgumentException:org.hibernate.hql.internal.ast.QuerySyntaxException:无法找到类 [package.to.ListeDeControleDetailsMission] [SELECT new package.to.ListeDeControleDetailsMission(lm ,count(*) as totalNumber) from com.app.gsc.entities.ListeDeControleDetailsMission lm where lm.boolDepart=false GROUP BY lm.listeDeCriteres.designation,lm.ficheDeMission.dateEtHeurDeDepart]
    • 而不是 package.to 你必须编写 ListeDeControleDetailsMission 类的实际包。并在构造函数中编写您想要返回的每个字段。正如我在答案中所做的那样
    • 等等...我会试试的
    猜你喜欢
    • 2018-02-17
    • 2016-08-06
    • 1970-01-01
    • 1970-01-01
    • 2016-12-10
    • 2016-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多