【问题标题】:JPA getResultList() returns BigInteger for MySQL but Integer for Microsoft SQL serverJPA getResultList() 为 MySQL 返回 BigInteger,但为 Microsoft SQL 服务器返回 Integer
【发布时间】:2012-06-05 12:24:15
【问题描述】:

我有以下方法:

Query q = getEntityManager().createNativeQuery("SELECT COUNT(1) FROM table1 WHERE column = :column_id " + "UNION " + "SELECT COUNT(1) FROM table2 WHERE column = :column_id");
q.setParameter("column_id", column_id);

当我想获取计数列表(将是 2 行)时,我执行此操作:

List<BigInteger> counts = (List<BigInteger>) q.getResultList();

这在 MySQL 中运行良好。但是一旦我连接到 MS SQL 服务器,我就会得到一个整数对象列表:

List<Integer>

知道为什么会有差异吗?

【问题讨论】:

  • 你的标题倒退了。
  • 您使用哪种 JPA 实现?
  • 您是否尝试过明确设置预期的返回类型,例如getEntityManager().createNativeQuery("SELECT COUNT(1) FROM table1 WHERE column = :column_id " + "UNION " + "SELECT COUNT(1) FROM table2 WHERE column = :column_id",Integer.class);
  • 哈桑:谢谢,我已经更新了标题
  • AhamedMustafaM:谢谢,我已经测试过了,但我得到了这个异常:org.hibernate.MappingException: Unknown entity: java.lang.Integer

标签: java mysql sql-server jpa


【解决方案1】:

JPA 定义了 JPQL 查询的返回类型,但对于本机 SQL 查询,您可以获得数据库返回的任何内容。这就是原生 SQL 查询的重点。

将您的代码更改为数字,

List<Number> counts = (List<Number>) q.getResultList();
long count = counts.get(0).longValue();

【讨论】:

  • 谢谢詹姆斯,您的解决方案就是解决方案! :-)
【解决方案2】:

它是在服务器端定义的

http://dev.mysql.com/doc/refman/5.0/en/group-by-functions.html#function_count

"返回 SELECT 语句检索的行中 expr 的非 NULL 值的计数。结果是 BIGINT 值。"

http://msdn.microsoft.com/en-us/library/aa258232%28v=sql.80%29

"返回类型

int"

【讨论】:

  • 嗯……但 JPA 不只是将数据库层与处理层分离吗?如何获得统一的结果?我只想使用 BigInteger OR Integer。我不在乎哪一个,只要 1 :-)
  • 正如 AhamedMusatafaM 所说,您是否尝试过 Query q = getEntityManager().createNativeQuery("SELECT COUNT(1) FROM table1 WHERE column = :column_id " + "UNION " + "SELECT COUNT(1) FROM table2 WHERE column = :column_id",Integer.class);
  • tagtraeumer:如果我尝试这样做,我会得到:javax.persistence.PersistenceException:org.hibernate.MappingException:未知实体:java.lang.Integer
猜你喜欢
  • 1970-01-01
  • 2015-09-15
  • 2021-09-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-06
  • 2020-02-02
相关资源
最近更新 更多