При использовании OpenJPA для выполнения оператора выбора в org.apache.derby базы данных в оперативной памяти, я встречаю эту ошибку:OpenJPA Синтаксическая ошибка: Обнаружен «оптимизируют»
javax.ejb.EJBException: The bean encountered a non-application exception; nested exception is:
<openjpa-2.1.2-SNAPSHOT-r422266:1636464 fatal general error> org.apache.openjpa.persistence.PersistenceException: Syntax error: Encountered "optimize" at line 1, column 80. {SELECT t0.VERSION, t0.SOMEOTHER_COLUMN FROM MYTABLE t0 WHERE t0.MYTABLE_CODE = ? optimize for 1 row} [code=20000, state=42X01] FailedObject: UDA [org.apache.openjpa.util.StringId] [java.lang.String]
Клиент OpenJPA встроен в IBM Клиент WebSphere: com.ibm.ws.jpa.thinclient-8.5.5.5.jar
Очевидно, OpenJPA добавляет часть «оптимизировать для 1 строки», потому что считает, что она имеет дело с DB2? Как это возможно? Есть ли способ отключить эту функцию?
я нашел какое-то объяснение на постфиксе «оптимизировать для 1 ряда»: https://www.ibm.com/developerworks/community/blogs/22586cb0-8817-4d2c-ae74-0ddcc2a409bc/entry/optimize_for_1_row1?lang=en
Вне JPA Я постоянно использую оператор optimize для DB2. Это способ сказать оптимизатору выбрать путь доступа, который быстрее всего подходит для x строк. Если вы хотите только 1 строку, он может выбрать другой путь доступа, если вы хотите 20. Неважно, сколько строк находится в наборе результатов, вы можете пролистывать страницы, но он просто выбирает конкретный план доступа. –
Я ошибся, эта часть кода использует базу данных в памяти (Derby). Я отрегулирую исходный вопрос. – Kjeld
Где ваша конфигурация БД? Где-то вы должны установить диалект. Похоже, что вы используете этот набор для DB2, когда используете Derby. Вероятно, вам понадобится несколько разных профилей, чтобы вы могли переключаться между конфигурацией конфигурации и live config. –