Spring Data JPA EclipseLink в Oracle

#sql #oracle #spring-boot #spring-data-jpa #eclipselink

#sql #Oracle #весенняя загрузка #spring-data-jpa #ссылка на затмение

Вопрос:

У меня есть этот репозиторий:

 @Repository
public interface EnvaRepository extends JpaRepository<Enva, Long> {
}
 

и этот запрос:

  envaRepository.findAllById(lopn.getEnvans());
 

но на консоли у меня есть эта ошибка:

 SELECT t0.PERSONNE_ID, t0.DT_NAISSANCE, t1.PERSONNE_ID FROM PERSONNE t0, ENVA t1
WHERE ((t0.PERSONNE_ID IN ((777,777))) AND (t1.PERSONNE_ID = t0.PERSONNE_ID));

[42000][907] ORA-00907: parenthèse de droite absente
 

Мой класс конфигурации:

 @Configuration
public class JpaConfiguration extends JpaBaseConfiguration {

    protected JpaConfiguration(DataSource dataSource, JpaProperties properties, ObjectProvider<JtaTransactionManager> jtaTransactionManager, ObjectProvider<TransactionManagerCustomizers> transactionManagerCustomizers) {
        super(dataSource, properties, jtaTransactionManager, transactionManagerCustomizers);
    }

    @Override
    protected AbstractJpaVendorAdapter createJpaVendorAdapter() {
        log.debug("Using EclipseLinkJpaVendorAdapter");
        return new EclipseLinkJpaVendorAdapter();
    }

    @Bean
    @Primary
    public static JpaProperties properties() {
        final JpaProperties jpaProperties = new JpaProperties();
        jpaProperties.setShowSql(true);
        jpaProperties.setDatabasePlatform("org.eclipse.persistence.platform.database.OraclePlatform");
        return jpaProperties;
    }

    @Override
    protected Map<String, Object> getVendorProperties() {
        HashMap<String, Object> map = new HashMap<>();
        map.put(PersistenceUnitProperties.WEAVING, detectWeavingMode());
        return map;
    }

    private String detectWeavingMode() {
        return InstrumentationLoadTimeWeaver.isInstrumentationAvailable() ? "true" : "static";
    }
}
 

Комментарии:

1. Как spring создает запрос JPQL? Для работы необходимо использовать » .. in :variable «, а не заключать переменную коллекции в скобки.

2. Можете ли вы поделиться своей сущностью Enva ? Вызываете ли вы какой-либо другой запрос, кроме этого?

Ответ №1:

 @Query("SELECT e FROM Enva e where e.personneId IN :envantIds")
    List<Enva> findAllById(Iterable<Long> envantIds);
 

Ответ №2:

избавьтесь от лишних круглых скобок в вашем операторе IN следующим образом:

 SELECT t0.PERSONNE_ID, t0.DT_NAISSANCE, t1.PERSONNE_ID 
FROM PERSONNE t0, ENVA t1
WHERE ((t0.PERSONNE_ID IN (777,777)) 
AND (t1.PERSONNE_ID = t0.PERSONNE_ID));
 

Комментарии:

1. Запрос автоматически создается для EclipseLink

2. Я не знаком с EclispeLink, но, возможно, где-то есть конфигурация, или это может быть настоящая ошибка!