Java 为什么我的jpql.getResultList()为一个好的查询返回0行
昨天我使用了完全相同的查询,今天它工作正常。我对程序流做了一些更改,查询不再返回行 我的程序的第一个功能是:Java 为什么我的jpql.getResultList()为一个好的查询返回0行,java,mysql,jpa,netbeans,jpql,Java,Mysql,Jpa,Netbeans,Jpql,昨天我使用了完全相同的查询,今天它工作正常。我对程序流做了一些更改,查询不再返回行 我的程序的第一个功能是: public void prepareSummary(Date startDate , Date endDate) { int getStartDay = getDayFromDate(startDate); int getStartMonth = getMonthFromDate(startDate); // int getEndDay = getDayFromD
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
{
}
}
公共作废准备摘要(日期开始日期、日期结束日期)
{
int getStartDay=getDayFromDate(startDate);
int getStartMonth=getMonthFromDate(startDate);
//
int getEndDay=getDayFromDate(endDate);
int getEndMonth=getMonthFromDate(endDate);
int getYear=getYearFromDate(startDate);
if(getStartMonth检查生成的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";
“选择计数pCount,”
+“p.nameText,”
+“g.nameText,”
+“t.shiftID”
+“从图纸的外部连接s.SpecialName索引p,”
+外部联接s.GradeName索引g,外部联接s.shiftIndex t
+“其中s.createdLocal>:开始和s.createdLocal<:结束”
+“按p.nameText、g.nameText、t.shiftID分组”;
好吧,它昨天工作的事实并不意味着它今天就必须工作。所有坏掉的东西以前都工作过。只需复制SQL查询,使用任何DB客户端手动执行它,并检查它是否返回您期望的结果。这样,您就可以确定SQL查询或数据是坏了还是Java代码坏了。
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);
}
}
"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";