简体   繁体   English

为什么我的jpql .getResultList()返回0行以获得良好的查询

[英]Why is my jpql .getResultList() returning 0 rows for a good query

I was using the exact same query yesterday and it was working fine today I made a few changes to flow of the program and the query no longer returns and rows. 昨天我使用完全相同的查询,今天工作正常,我对程序流程进行了一些更改,查询不再返回和返回行。

the first function that my programs goes to: 我的程序的第一个功能是:

 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
   {

   }


}

Here is what getSumList looks like: 这是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();
}

This next function doesn't matter at this point because nothing is being executed because the list length is zero: 此时的下一个函数无关紧要,因为列表长度为零,因此未执行任何操作:

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);

        }


    }

Check the SQL that is generated, and the tables you are querying over. 检查生成的SQL以及要查询的表。 As the query requires inner joins, if one of the tables was cleared, it would return no results. 由于查询需要内部联接,因此如果清除其中一个表,则不会返回任何结果。 If you want to get a 0 count, you need to use an outer join syntax which isn't possible in JPA unless you use object level mappings: 如果要计数为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";

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM