当OpenJPA用SQL参数替换我的常量值时,我似乎对CHAR
字段上的查询有问题,该查询被错误地过滤了。
在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"
作为参数。之前的常数&#34; type
的值现在是一个SQL参数。问题在于,对于char(3)
type
列,Oracle将存储
"V "
,这不等于OpenJPA作为参数传递的值。再说一遍:没有参数,即只使用我在JPQL中使用的SQL中的字符串,一切正常。
我假设OpenJPA执行此替换以通过规范化所有查询来最小化查询缓存,我知道这对很多人来说有很大的不同,但我认为这是我的问题。
我现在的问题是:如何阻止OpenJPA进行此替换?我知道我在运行时没有对此查询进行不同的排列。是否有可以使用的配置属性或查询提示?
答案 0 :(得分:0)
除了将列更改为VARCHAR
之外,我还有两个不太好的解决方法:
where p.type = 'V '
(&#34; V&#34;后跟两个空格)。在(1)中,我知道底层的char(3)
,而JPQL的想法是将其抽象出来,所以这有点反对使用JPA的想法。
使用(2)我必须稍微重写这个简单的查询,但是使用本机查询似乎不正确,以避免由我的持久性提供程序的良好意图所产生的问题。