【问题标题】:Why is my jpql .getResultList() returning 0 rows for a good query为什么我的 jpql .getResultList() 返回 0 行以获得良好的查询
【发布时间】:2016-01-03 17:26:12
【问题描述】:

我昨天使用了完全相同的查询,今天运行良好。我对程序流程进行了一些更改,查询不再返回和行。

我的程序执行的第一个函数:

 public void prepareSummary(Date startDate , Date endDate)
{
int getStartDay = getDayFromDate(startDate);
   int getStartMonth = getMonthFromDate(startDate);
   //

   int getEndDay = getDayFromDate(endDate);
   int getEndMonth = getMonthFromDate(endDate);

   int getYear = getYearFromDate(startDate);

   if(getStartMonth <= getEndMonth)
   {
       if(getStartMonth == getEndMonth)
       {
           if(getStartDay < getEndDay)
           {    
               while(getStartDay <= getEndDay)
               {
                   Calendar cal = Calendar.getInstance();
                   cal.set( getYear, getStartMonth, getStartDay);
                   Date queryStart = getStartOfDay(cal.getTime());
                   Date queryEnd = getEndOfDay(cal.getTime());

                  List<Object[]> res = getSumList(queryStart, queryEnd);
                  doQuery(res);
               ++getStartDay;
               }


           }
           else
           {


           }

       }
       else
       {



   }


   }
   else
   {

   }


}

getSumList 如下所示:

public List<Object[]> getSumList(Date start, Date end) {
    String query = "";
    query += "SELECT COUNT(s) pCount,"
            + "p.nameText,"
            + "g.nameText,"
            + "t.shiftID"
            + " FROM Sheets s , GradeNames g , SpecieNames p, ShiftTimes t"
            + " WHERE s.createdLocal > :start and s.createdLocal < :end"
            + " AND s.specieNameIndex = p.nameIndex "
            + " AND s.gradeNameIndex = g.nameIndex"
            + " AND s.shiftIndex = t.shiftIndex"
            + " GROUP BY p.nameText , g.nameText , t.shiftID";
    Query q = em.createQuery(query);
    q.setParameter("start", start);
    q.setParameter("end", end);
    return q.getResultList();
}

此时下一个函数无关紧要,因为列表长度为零,因此没有执行任何操作:

private void doQuery(List<Object[]> obj)
    {
         int length = obj.size();
        String grade = null;
        Long standingCount = (long) 0;

        System.out.println("Length" + length);


        for (int i = 0; i < length; ++i) {
            // HAVE A LIST OF ALL ITEMS PULLED FROM DATABASE
            Object[] tmpObj = obj.get(i);
            Long tmpCount = (Long) tmpObj[0];
            String tmpSpecieName = (String) tmpObj[1];
            Double tmpThickness = Double.parseDouble(getSpecie().getThicknessFromSpecie(tmpSpecieName));
            String tmpLength = getSpecie().getLengthFromSpecie(tmpSpecieName);
            String tmpGradeName = (String) tmpObj[2];
            String tmpShift = (String) tmpObj[3];
            tmpSpecieName = getSpecie().getSpecieFromSpecie(tmpSpecieName);
            //// END OF ALL ITEMS PULLED FROM DATABASE
            if (grade != pullGradeName(tmpGradeName) && grade != null) {

                  System.out.println("Count:" + standingCount + "Grade:" + tmpGradeName + "--" + "Specie" + tmpSpecieName + "Shift:" + tmpShift + "Thickness:" + tmpThickness + "Length:" + tmpLength + "SpecieNAme:" + tmpSpecieName);


                // do previous insert
                grade = pullGradeName(tmpGradeName);

            } else if (grade != pullGradeName(tmpGradeName) && grade == null) {
                grade = pullGradeName(tmpGradeName);
            } else if (grade == pullGradeName(tmpGradeName)) {
                standingCount = standingCount + tmpCount;
            }

            System.out.println("Count:" + tmpCount + "Grade:" + tmpGradeName + "--" + "Specie" + tmpSpecieName + "Shift:" + tmpShift + "Thickness:" + tmpThickness + "Length:" + tmpLength + "SpecieNAme:" + tmpSpecieName);

        }


    }

【问题讨论】:

  • 嗯,它昨天工作的事实并不意味着它今天必须工作。所有被破坏的东西以前都在工作。只需复制您的 SQL 查询,使用任何数据库客户端手动执行它并检查它是否返回您所期望的。通过这种方式,您可以决定您的 SQL 查询或数据是否损坏或您的 Java 代码是否损坏。

标签: java mysql jpa netbeans jpql


【解决方案1】:

检查生成的 SQL 以及您要查询的表。由于查询需要内部连接,因此如果其中一个表被清除,它将不返回任何结果。如果您想获得 0 计数,则需要使用外连接语法,这在 JPA 中是不可能的,除非您使用对象级映射:

"SELECT COUNT(s) pCount,"
            + "p.nameText,"
            + "g.nameText,"
            + "t.shiftID"
            + " FROM Sheets s outer join s.specialNameIndex p,"
            + " outer join s.gradeNameIndex g, outer join s.shiftIndex t"
            + " WHERE s.createdLocal > :start and s.createdLocal < :end"
            + " GROUP BY p.nameText , g.nameText , t.shiftID";

【讨论】:

    猜你喜欢
    • 2015-05-10
    • 1970-01-01
    • 1970-01-01
    • 2017-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-12
    • 1970-01-01
    相关资源
    最近更新 更多