gpt4 book ai didi

jpa - 什么控制标量 JPA native 查询的 List 元素类型?

转载 作者:行者123 更新时间:2023-12-04 19:43:02 26 4
gpt4 key购买 nike

JPA 提供了运行 native SQL 查询的能力:

final Query q = entityManager.createNativeQuery("SELECT hork FROM foobar");
assert q != null;
final List results = q.getResultList();

在上面的查询中,我的 List 中会出现什么样的对象?

看起来很简单,但是:

在我们的例子中,我们有一个 Informix TEXT柱子。 Informix TEXT type有点像 CLOB .

Informix JDBC 驱动程序报告——无论这是否属实,我们都无法更改它—— java.sql.Types field value to which this column is mappedjava.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)运行上面的 native 查询,您将在结果列表中得到不同的对象。

Hibernate 返回 String这只是 String 中列的内容形式,大概是通过 ResultSet#getString(int) (而不是 ResultSet#getObject(int) )或通过一些平台编码产生的 byte[] .

EclipseLink 返回 byte[] 的十六进制表示,当在 ASCII 字符集中解码和解释时,确实是列的内容。

我有两个相关的问题:
  • 我如何指示 JPA 标量 native SQL 查询的类型
    应该?
  • 如果 EclipseLink 没有返回 String代表栏目的内容,怎么不回我一个byte[] ?
  • 最佳答案

    很奇怪,您的 Informix JDBC 驱动程序将 TEXT 值作为字节 [] 返回,这似乎很错误,因为它是字符字段而不是二进制字段,它应该是字符串。您可能希望查看您的 JDBC 驱动程序是否对此进行了修复。

    JPA 似乎将值作为字符串获取,因为 JDBC 元数据表示它是一个字符串。

    对于 EclipseLink,真正发生的事情是 LONGVARCHAR 被解释为 Clob 类型,并且由于 Clob 可以只是一个定位器,因此必须获取整个值,因此它将预期的 Clob 转换为字符串,但由于它实际上是一个字节[],它将转换器转换为十六进制。您可以在 InformixPlatofrm 中通过覆盖 isClob 并为 LONGVARCHAR 返回 false 来解决此问题,但真正的问题是 JDBC 驱动程序为字符字段返回一个 byte[]。

    关于jpa - 什么控制标量 JPA native 查询的 List 元素类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15937760/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com