我偶然发现了OpenEJB(即JtaQuery)中javax.persistence.Query
的实现问题,我倾向于认为这是一个错误,但也许我错了。
我有这段代码:
final Query fakeLoginQuery = this.systemSettingsEM
.createNativeQuery("select value from SystemSettings where Name = 'IAM_FAKE_LOGIN'");
fakeLoginQuery.unwrap(SQLQuery.class).addScalar("value", StringType.INSTANCE);
final String fakeLogin = (String) fakeLoginQuery.getSingleResult();
现在不要问我为什么要在第2行做这件事(看起来,虽然我正在为我的SQL Server指定方言,这里 - 而且只是来自所有代码库 - hibernate正在使用简单的方言,而不是指定的方言,但这是另一个问题)
在Tomee 中,来自OpenEJB(JtaQuery)的java.persistence.Query
的实现从unwrap()返回一个实例,该实例与执行fakeLoginQuery.getSingleResult()
时委托的实例不同。显然,它委托给它的实例没有类型映射集,并且它与可怕的内容大喊:
org.hibernate.MappingException: No Dialect mapping for JDBC type: -9
-9是nvarchar。
在JBoss中这件事情完美无缺,这意味着org.hibernate.SQLQuery
返回的unwrap()
实例与fakeLoginQuery.getSingleResult()
委托给的实例相同。
为什么OpenEJB会这样做?或者是另一种方式,JBOss的Query
实现只是因为“它知道”hibernate的方式吗?
答案 0 :(得分:0)
请尝试以下两种方式:
方法1.将StringType.INSTANCE更改为Hibernate.STRING,如下所示:
fakeLoginQuery.unwrap(SQLQuery.class).addScalar("value", Hibernate.STRING);
方式2.创建自己的Hibernate方言,例如,如下:
fakeLoginQuery.unwrap(SQLQuery.class).addScalar("value", Hibernate.STRING);
:)