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[]?