JPA 提供了运行原生 SQL 查询的能力:
final Query q = entityManager.createNativeQuery("SELECT hork FROM foobar");
assert q != null;
final List results = q.getResultList();
在上面的查询中, my 中将出现什么样的对象List
?
看起来很简单,但是:
在我们的例子中,我们有一个 InformixTEXT
列。InformixTEXT
类型有点CLOB
像.
Informix JDBC 驱动程序报告——不管这是否属实,我们都不能改变它——java.sql.Types
该列映射到的字段值是java.sql.Types#LONGVARCHAR
. 好的。
如果您像这样运行常规的旧 JDBC 查询:
final ResultSet rs = someStatement.executeQuery("SELECT hork FROM foobar");
assert rs != null;
while (rs.next()) {
final Object result = rs.getObject(1);
// see if you can guess what result.getClass() is
}
...您正在与 合作byte[]
,而不是String
。
现在,如果您使用两大 JPA 提供程序(Hibernate、EclipseLink)运行上面的本机查询,您将在结果列表中获得不同的对象。
Hibernate 返回 a String
,它只是表单中列的内容String
,可能是通过ResultSet#getString(int)
(而不是ResultSet#getObject(int)
)或通过结果的某种平台编码byte[]
。
EclipseLink 返回 a 的十六进制表示byte[]
,当以 ASCII 字符集解码和解释时,它确实是列的内容。
我有两个相关的问题:
如何指示 JPA 标量原生 SQL 查询的类型应该是什么?
如果 EclipseLink 没有返回
String
代表列内容的 a ,为什么它不只是返回 abyte[]
?