ORA-00979 не группируется по выражению. Ошибка в запросе JPA с Hibernate. ⇐ JAVA
-
Anonymous
ORA-00979 не группируется по выражению. Ошибка в запросе JPA с Hibernate.
У меня возникла проблема при попытке создать ежедневный процесс создания статистики для моего приложения. Я успешно создал первоначальный подход, который работает для получения сегодняшней статистики:
@Query(value = "SELECT " + "Arrendador.id КАК ArrendadorId", + "Tipo_Actividad.id AS типoComunicacionId, " + "TO_CHAR(SYSDATE, 'ГГГГ-ММ-ДД') AS fecha, " + "COUNT(CASE WHEN TRUNC(Com.fecha_contrato) = TRUNC(SYSDATE) THEN 1 END) AS cantidad, " + "NVL(UltimaComunicacion.UltimaFechaContrato, TO_DATE('1900-01-01', 'ГГГГ-ММ-ДД')) AS fechaUltimoEnvio, " + "TRUNC(SYSDATE) - TRUNC(NVL(UltimaComunicacion.UltimaFechaContrato, Arrendador.fecha_alta)) AS DiasSinEnviar " + "ИЗ Аррендадора" + "LEFT JOIN (SELECT arrendador_id, MAX(fecha_contrato) AS ultimaFechaContrato ИЗ ГРУППЫ Comunicacion ПО arrendador_id) UltimaComunicacion ON Arrendador.id = UltimaComunicacion.arrendador_id " + "LEFT JOIN Comunicacion Com ON Arrendador.id = Com.arrendador_id" + "LEFT JOIN Tipo_Comunicacion ON Com.tipo_comunicacion_id = Tipo_Comunicacion.id " + "Присоединяйтесь к Tipo_Arrendador ON Arrendador.tipo_arrendador_id = Tipo_Arrendador.id " + "Присоединяйтесь к Tipo_Actividad ON Arrendador.tipo_actividad_id = Tipo_Actividad.id " + "GROUP BY Arrendador.id, Tipo_Actividad.id, NVL(UltimaComunicacion.UltimaFechaContrato, TO_DATE('1900-01-01', 'ГГГГ-ММ-ДД')), TRUNC(SYSDATE) - TRUNC(NVL(UltimaComunicacion.UltimaFechaContrato, Аррендадор.fecha_alta))", родной запрос = истина) List obtenerDatosConsulta(); Однако проблема возникает, когда я пытаюсь получить статистику за определенный день. Я изменил запрос следующим образом:
@Query(value = "SELECT " + " Arrendador.id КАК ArrendadorId, " + " Tipo_Actividad.id AS типoComunicacionId, " + " TO_CHAR(TO_DATE(:fechaParametro, 'гггг-ММ-дд'), 'гггг-ММ-дд') AS fecha, " + " COUNT(CASE WHEN TRUNC(Com.fecha_contrato) = TRUNC(TO_DATE(:fechaParametro, 'гггг-ММ-дд')) THEN 1 END) AS cantidad, " + " NVL(UltimaComunicacion.UltimaFechaContrato, TO_DATE('1900-01-01', 'гггг-ММ-дд')) AS fechaUltimoEnvio, " + " TRUNC(TO_DATE(:fechaParametro, 'гггг-ММ-дд')) - TRUNC(NVL(UltimaComunicacion.UltimaFechaContrato, Arrendador.fecha_alta)) AS DiasSinEnviar " + "ИЗ Аррендадора" + "LEFT JOIN (SELECT arrendador_id, MAX(fecha_contrato) AS ultimaFechaContrato ИЗ ГРУППЫ Comunicacion ПО arrendador_id) UltimaComunicacion ON Arrendador.id = UltimaComunicacion.arrendador_id " + "LEFT JOIN Comunicacion Com ON Arrendador.id = Com.arrendador_id" + "LEFT JOIN Tipo_Comunicacion ON Com.tipo_comunicacion_id = Tipo_Comunicacion.id " + "Присоединяйтесь к Tipo_Arrendador ON Arrendador.tipo_arrendador_id = Tipo_Arrendador.id " + "Присоединяйтесь к Tipo_Actividad ON Arrendador.tipo_actividad_id = Tipo_Actividad.id " + "ГРУППА ПО Arrendador.id", + " Типо_Actividad.id, " + " TO_CHAR(TO_DATE(:fechaParametro, 'гггг-ММ-дд'), 'гггг-ММ-дд'), " + " NVL(UltimaComunicacion.UltimaFechaContrato, TO_DATE('1900-01-01', 'гггг-ММ-дд')), " + " TRUNC(TO_DATE(:fechaParametro, 'гггг-ММ-дд')) - TRUNC(NVL(UltimaComunicacion.UltimaFechaContrato, Arrendador.fecha_alta))", родной запрос = истина) List obtenerDatosConsulta(@Param("fechaParametro") String fechaParametro); Проблема в том, что при выполнении этого оператора выбора я получаю следующую ошибку Oracle: «ORA-00979 не является группировкой по выражению». Я пробовал передать дату как java.util.Date, java.sql.Date и как строку, всегда в формате «гггг-ММ-дд», но продолжаю получать ту же ошибку. Однако когда я запускаю запрос через SQL Developer, я не вижу следующей ошибки:
ВЫБРАТЬ Tenant.id КАК tenantId, Activity_Type.id AS тип CommunicationId, TO_CHAR(TO_DATE(?, 'гггг-ММ-дд'), 'гггг-ММ-дд') Дата AS, COUNT(CASE WHEN TRUNC(Com.contract_date) = TRUNC(TO_DATE(?, 'гггг-ММ-дд')) THEN 1 END) AS sum, . NVL(LastCommunication.LastDateContract, TO_DATE('1900-01-01', 'гггг-ММ-дд')) AS dateLastSubmission, TRUNC(TO_DATE(?, 'гггг-ММ-дд')) - TRUNC(NVL(LastCommunication.LastDateContract, Tenant.high_date)) AS днейБез доставки ОТ Жилец ЛЕВОЕ ПРИСОЕДИНЕНИЕ (ВЫБЕРИТЕ tenant_id, MAX(contract_date) AS lastContractDate ИЗ ГРУППЫ коммуникаций ПО tenant_id) LastCommunication ON Tenant.id = LastCommunication.tenant_id ЛЕВОЕ ПРИСОЕДИНЕНИЕ Связь Com ON Tenant.id = Com.tenant_id ЛЕВОЕ ПРИСОЕДИНЕНИЕ Тип_связи ВКЛ. Com.type_type_id = Тип_связи.id ПРИСОЕДИНИТЬСЯ Tenant_Type ON Tenant.tenant_type_id = Tenant_Type.id ПРИСОЕДИНИТЬСЯ Activity_Type ON Tenant.activity_type_id = Activity_Type.id ГРУППА ПО Идентификатор арендатора, Тип_активности.id, NVL(LastCommunication.LastDateContract, TO_DATE('1900-01-01', 'гггг-ММ-дд')), TRUNC(TO_DATE(?, 'гггг-ММ-дд')) - TRUNC(NVL(LastCommunication.LastDateContract, Tenant.high_date)) Последний запрос копируется и вставляется непосредственно из журнала Hibernate, и вот как я передаю параметры:
org.hibernate.type.descriptor.sql.BasicBinder: параметр привязки[1] как [VARCHAR] — [2023-12-03] org.hibernate.type.descriptor.sql.BasicBinder: параметр привязки[2] как [VARCHAR] — [2023-12-03]; org.hibernate.type.descriptor.sql.BasicBinder: параметр привязки[3] как [VARCHAR] — [2023-12-03]; org.hibernate.type.descriptor.sql.BasicBinder: параметр привязки[4] как [VARCHAR] — [2023-12-03]; Я не знаю, что еще делать. Запрос работает нормально при выполнении в SQL Developer, и он работает, если вы жестко закодировали :dateParameter для определенной даты, например «2023-12-04». Буду очень признателен за любую помощь. Спасибо.
Нужно знать, как вставить/передать дату в jpa
У меня возникла проблема при попытке создать ежедневный процесс создания статистики для моего приложения. Я успешно создал первоначальный подход, который работает для получения сегодняшней статистики:
@Query(value = "SELECT " + "Arrendador.id КАК ArrendadorId", + "Tipo_Actividad.id AS типoComunicacionId, " + "TO_CHAR(SYSDATE, 'ГГГГ-ММ-ДД') AS fecha, " + "COUNT(CASE WHEN TRUNC(Com.fecha_contrato) = TRUNC(SYSDATE) THEN 1 END) AS cantidad, " + "NVL(UltimaComunicacion.UltimaFechaContrato, TO_DATE('1900-01-01', 'ГГГГ-ММ-ДД')) AS fechaUltimoEnvio, " + "TRUNC(SYSDATE) - TRUNC(NVL(UltimaComunicacion.UltimaFechaContrato, Arrendador.fecha_alta)) AS DiasSinEnviar " + "ИЗ Аррендадора" + "LEFT JOIN (SELECT arrendador_id, MAX(fecha_contrato) AS ultimaFechaContrato ИЗ ГРУППЫ Comunicacion ПО arrendador_id) UltimaComunicacion ON Arrendador.id = UltimaComunicacion.arrendador_id " + "LEFT JOIN Comunicacion Com ON Arrendador.id = Com.arrendador_id" + "LEFT JOIN Tipo_Comunicacion ON Com.tipo_comunicacion_id = Tipo_Comunicacion.id " + "Присоединяйтесь к Tipo_Arrendador ON Arrendador.tipo_arrendador_id = Tipo_Arrendador.id " + "Присоединяйтесь к Tipo_Actividad ON Arrendador.tipo_actividad_id = Tipo_Actividad.id " + "GROUP BY Arrendador.id, Tipo_Actividad.id, NVL(UltimaComunicacion.UltimaFechaContrato, TO_DATE('1900-01-01', 'ГГГГ-ММ-ДД')), TRUNC(SYSDATE) - TRUNC(NVL(UltimaComunicacion.UltimaFechaContrato, Аррендадор.fecha_alta))", родной запрос = истина) List obtenerDatosConsulta(); Однако проблема возникает, когда я пытаюсь получить статистику за определенный день. Я изменил запрос следующим образом:
@Query(value = "SELECT " + " Arrendador.id КАК ArrendadorId, " + " Tipo_Actividad.id AS типoComunicacionId, " + " TO_CHAR(TO_DATE(:fechaParametro, 'гггг-ММ-дд'), 'гггг-ММ-дд') AS fecha, " + " COUNT(CASE WHEN TRUNC(Com.fecha_contrato) = TRUNC(TO_DATE(:fechaParametro, 'гггг-ММ-дд')) THEN 1 END) AS cantidad, " + " NVL(UltimaComunicacion.UltimaFechaContrato, TO_DATE('1900-01-01', 'гггг-ММ-дд')) AS fechaUltimoEnvio, " + " TRUNC(TO_DATE(:fechaParametro, 'гггг-ММ-дд')) - TRUNC(NVL(UltimaComunicacion.UltimaFechaContrato, Arrendador.fecha_alta)) AS DiasSinEnviar " + "ИЗ Аррендадора" + "LEFT JOIN (SELECT arrendador_id, MAX(fecha_contrato) AS ultimaFechaContrato ИЗ ГРУППЫ Comunicacion ПО arrendador_id) UltimaComunicacion ON Arrendador.id = UltimaComunicacion.arrendador_id " + "LEFT JOIN Comunicacion Com ON Arrendador.id = Com.arrendador_id" + "LEFT JOIN Tipo_Comunicacion ON Com.tipo_comunicacion_id = Tipo_Comunicacion.id " + "Присоединяйтесь к Tipo_Arrendador ON Arrendador.tipo_arrendador_id = Tipo_Arrendador.id " + "Присоединяйтесь к Tipo_Actividad ON Arrendador.tipo_actividad_id = Tipo_Actividad.id " + "ГРУППА ПО Arrendador.id", + " Типо_Actividad.id, " + " TO_CHAR(TO_DATE(:fechaParametro, 'гггг-ММ-дд'), 'гггг-ММ-дд'), " + " NVL(UltimaComunicacion.UltimaFechaContrato, TO_DATE('1900-01-01', 'гггг-ММ-дд')), " + " TRUNC(TO_DATE(:fechaParametro, 'гггг-ММ-дд')) - TRUNC(NVL(UltimaComunicacion.UltimaFechaContrato, Arrendador.fecha_alta))", родной запрос = истина) List obtenerDatosConsulta(@Param("fechaParametro") String fechaParametro); Проблема в том, что при выполнении этого оператора выбора я получаю следующую ошибку Oracle: «ORA-00979 не является группировкой по выражению». Я пробовал передать дату как java.util.Date, java.sql.Date и как строку, всегда в формате «гггг-ММ-дд», но продолжаю получать ту же ошибку. Однако когда я запускаю запрос через SQL Developer, я не вижу следующей ошибки:
ВЫБРАТЬ Tenant.id КАК tenantId, Activity_Type.id AS тип CommunicationId, TO_CHAR(TO_DATE(?, 'гггг-ММ-дд'), 'гггг-ММ-дд') Дата AS, COUNT(CASE WHEN TRUNC(Com.contract_date) = TRUNC(TO_DATE(?, 'гггг-ММ-дд')) THEN 1 END) AS sum, . NVL(LastCommunication.LastDateContract, TO_DATE('1900-01-01', 'гггг-ММ-дд')) AS dateLastSubmission, TRUNC(TO_DATE(?, 'гггг-ММ-дд')) - TRUNC(NVL(LastCommunication.LastDateContract, Tenant.high_date)) AS днейБез доставки ОТ Жилец ЛЕВОЕ ПРИСОЕДИНЕНИЕ (ВЫБЕРИТЕ tenant_id, MAX(contract_date) AS lastContractDate ИЗ ГРУППЫ коммуникаций ПО tenant_id) LastCommunication ON Tenant.id = LastCommunication.tenant_id ЛЕВОЕ ПРИСОЕДИНЕНИЕ Связь Com ON Tenant.id = Com.tenant_id ЛЕВОЕ ПРИСОЕДИНЕНИЕ Тип_связи ВКЛ. Com.type_type_id = Тип_связи.id ПРИСОЕДИНИТЬСЯ Tenant_Type ON Tenant.tenant_type_id = Tenant_Type.id ПРИСОЕДИНИТЬСЯ Activity_Type ON Tenant.activity_type_id = Activity_Type.id ГРУППА ПО Идентификатор арендатора, Тип_активности.id, NVL(LastCommunication.LastDateContract, TO_DATE('1900-01-01', 'гггг-ММ-дд')), TRUNC(TO_DATE(?, 'гггг-ММ-дд')) - TRUNC(NVL(LastCommunication.LastDateContract, Tenant.high_date)) Последний запрос копируется и вставляется непосредственно из журнала Hibernate, и вот как я передаю параметры:
org.hibernate.type.descriptor.sql.BasicBinder: параметр привязки[1] как [VARCHAR] — [2023-12-03] org.hibernate.type.descriptor.sql.BasicBinder: параметр привязки[2] как [VARCHAR] — [2023-12-03]; org.hibernate.type.descriptor.sql.BasicBinder: параметр привязки[3] как [VARCHAR] — [2023-12-03]; org.hibernate.type.descriptor.sql.BasicBinder: параметр привязки[4] как [VARCHAR] — [2023-12-03]; Я не знаю, что еще делать. Запрос работает нормально при выполнении в SQL Developer, и он работает, если вы жестко закодировали :dateParameter для определенной даты, например «2023-12-04». Буду очень признателен за любую помощь. Спасибо.
Нужно знать, как вставить/передать дату в jpa
Мобильная версия