#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, но, возможно, где-то есть конфигурация, или это может быть настоящая ошибка!