2015-07-20 15 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)我必须稍微重写一下这个简单的查询,但仅仅为了避免我的持久性提供者的好意所产生的问题而使用本地查询似乎不太合适。

相关问题