我对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