我對CHAR
字段的查詢看起來有問題,當OpenJPA用SQL參數替換我的常量值時,該字段被錯誤地過濾。如何防止OpenJPA在我的查詢中替換「常量」參數?
例
鑑於這種表中的Oracle
create table PERSON (
id char(10) not null,
type char(3) not null,
primary key (id)
)
具有三個不同的值用於type
:WTW,WAI,V
和相應的實體
@Entity
public class Person {
String id;
String type;
}
我使用以下查詢從一個orm.xml文件:
<named-query name="person.v">
<query>
select p
from Person p
where p.type = 'V'
</query>
</named-query>
問題
當運行此通過OpenJPA中提供一個EntityManager,查詢變更
select p.id, p.type
from PERSON p
where p.type = ?
並且OpenJPA通過值"V"
作爲參數。 type
之前的「常量」值現在是一個SQL參數。問題就在於,對於char(3)
type
列,Oracle將存儲
"V "
,這是不是等於OpenJPA的作爲參數傳遞的價值。再說一遍:沒有參數,即只使用JPQL中使用的SQL中的字符串,一切正常。
我假設OpenJPA執行此替換爲了儘量減少查詢緩存通過規範化所有查詢,我明白,這對很多人來說是一個很大的區別,但我認爲這是我的情況的問題。
我現在的問題是:如何防止OpenJPA進行這種替換?我知道在運行時我不會有這個查詢的不同排列。有沒有可以使用的配置屬性或查詢提示?
快速更新:OpenJPA在預處理語句中如何處理'char'類型沒有問題。它只是無法處理列的數據類型,因爲我們正在使用一個自定義的'PreparedStatement',其中包含實際(Oracle)語句的委託以及org.apache.openjpa.jdbc.sql,OracleDictionary([1]( https://github.com/apache/openjpa/blob/2.4.0/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/OracleDictionary.java#L556),[2](https ://github.com/apache/openjpa/blob/2.4.0/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/OracleDictionary.java#L1253))不起作用。 – Kariem