2015-07-30 3 views
0

я есть ошибка с этим запросомпружинные данных JPA максимальная совокупная функция где положение

@Repository 
    public interface DefinedAbsenceRepository extends 
      JpaRepository<DefinedAbsence, Long>, 
      JpaSpecificationExecutor<DefinedAbsence> { @Query("select da from defined_absence da where da.length=?1 and max (da.from, ?2) < min (da.to , ?3) ") 
     List<DefinedAbsence> getLongDefinedAbsenceWithinPeriod(
       AbsenceLength length, LocalDateTime from, LocalDateTime to); 
    }` 

и это класс

public class DefinedAbsence extends BaseBean { 
     public static enum AbsenceJustification { 
      JUSTIFIED, UNJUSTIFIED 
     } 
     private LocalDateTime from; 
     private LocalDateTime to; 
     private AbsenceLength length; 
     private String description; 
    //geter()+setter() 
    } 

Я использую конвертер для времени Joda

в ошибка Caused by: Exception [EclipseLink-0] (Eclipse Persistence Services - 2.5.2.v20140319-9ad6abd): org.eclipse.persistence.exceptions.JPQLException Exception Description: Syntax error parsing [select da from defined_absence da where da.length=?1 and max (da.from, ?2) < min (da.to , ?3) ]. [59, 70] The right expression is not a valid expression. [72, 95] The query contains a malformed ending.

+0

Не могли бы вы добавить свое определение 'DefinedAbsence' и' AbsenceLength'? –

+0

Я добавляю класс DefinedAbsence, я думаю, что мне нужно использовать «иметь» или «упорядочить», потому что агрегатная функция «max» и «min» не может использоваться в th, где пункт –

+0

'ORDER BY' не является агрегирующим предложением , вы имеете в виду 'GROUP BY'. –

ответ

1

Вы вводите в заблуждение функцию max(a, b) из языков программирования, который сравнивает два значения и возвращает большую, и функцию агрегации MAX(expression) от SQL, которая находит максимальное значение из всех строк результатов (возможно, сгруппированных) для одного выражения.

Чтобы использовать max(a, b) и min(a, b) в SQL, вы должны будете использовать CASE:

SELECT da FROM defined_absence da 
    WHERE da.length = ?1 AND 
    (CASE WHEN da.from > ?2 THEN da.from ELSE ?2) < (CASE WHEN da.to < ?3 THEN da.to ELSE ?3) 
+0

thx so much Tobias liefke –

0

это отлично работает для меня:

@Repository 
public interface DefinedAbsenceRepository extends 
     JpaRepository<DefinedAbsence, Long>, 
     JpaSpecificationExecutor<DefinedAbsence> { 

    @Query("select da from defined_absence da where da.length = ?1 and " 
      + "(CASE WHEN da.from > ?2 THEN da.from ELSE ?4 END) < " 
      + "(CASE WHEN da.to < ?3 THEN da.to ELSE ?5 END) ") 
    List<DefinedAbsence> get(AbsenceLength length, LocalDateTime from, 
      LocalDateTime to,Long f ,Long t); 
} 

я заменил "ELSE 2?" И «ELSE ? 3 "по атрибуту Long, потому что у меня есть ошибка с типом LocalDateTime. Я не знаю, почему eclipselink не может передать преобразователь (LocalDateTime в Long)

public List<DefinedAbsence> get(LocalDateTime from, LocalDateTime to) { 
     return definedAbsenceRepository.get(AbsenceLength.LONG, from, to, 
       from.toDateTime().getMillis(), to.toDateTime().getMillis()); 
    } 
Смежные вопросы