2015-07-20 17 views
0

我對CHAR字段的查詢看起來有問題,當OpenJPA用SQL參數替換我的常量值時,該字段被錯誤地過濾。如何防止OpenJPA在我的查詢中替換「常量」參數?

鑑於這種表中的Oracle

create table PERSON (
    id char(10) not null, 
    type char(3) not null, 
    primary key (id) 
) 

具有三個不同的值用於typeWTWWAIV

和相應的實體

@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進行這種替換?我知道在運行時我不會有這個查詢的不同排列。有沒有可以使用的配置屬性或查詢提示?

+0

快速更新: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

回答

0

除了僅僅更改列到VARCHAR,我有兩個解決方法是不是很漂亮:

  1. 適應JPQL到where p.type = 'V '(「V」跟兩個空格)。
  2. 使用不會被OpenJPA優化的本機查詢。

在(1)中,我知道底層的char(3),並且JPQL的想法是將它抽象出來,所以這與使用JPA的想法有點相反。

(2)我必須稍微重寫一下這個簡單的查詢,但僅僅爲了避免我的持久性提供者的好意所產生的問題而使用本地查詢似乎不太合適。

相關問題