【问题标题】:Obtaining a row number of a given row from MySQL via JPA通过 JPA 从 MySQL 获取给定行的行号
【发布时间】:2013-07-09 10:55:10
【问题描述】:

我正在 JPA 2.0 中执行以下 SQL,用于检索给定行的行号。

SELECT
    rownum 
FROM
    (SELECT
        @rownum:=@rownum+1 AS rownum,
        tbl.zone_id 
    FROM
        zone_table tbl,
        (SELECT
            @rownum:=0)t 
    ORDER BY
        tbl.zone_id DESC)t 
WHERE
    zone_id=?

我在 JPA 中使用以下方法来执行这个原生 SQL 查询。

Object object = entityManager.createNativeQuery("aboveQuery")
                             .setParameter("zone_id", id).getSingleResult();

object.toString() 返回喜欢

10.0
11.0
12.0
13.0

基于提供的id 等等。所以,这个值不能解析为java.lang.Long。我希望它显示一个没有小数点的值。为什么这个查询会产生这个结果。它与 MySQL 而不是 JPA 更相关。

我使用的是 MySQL 5.6.11


编辑:

我无法验证它在 MySQL 中返回的数据类型,因为它在 MySQL 中返回的结果没有小数点(此处考虑的主键类型为 BIGINT)。

当我在 PHP 中尝试这个查询时,它也产生了没有小数点的结果。所以,我可能认为它与 JPA 有关系。

【问题讨论】:

    标签: mysql jpa


    【解决方案1】:

    它很可能返回一个 BigDecimal,它是数据库 NUMBER 类型的标准类型。如果你想要一个 Long,只需将其转换为 Number 并调用 longValue()。

    ((Number)result).toLong()
    

    如果由于某种原因它是一个字符串,那么就使用,

    new BigDecimal((String)result).toLong()
    

    【讨论】:

    • 在 Hibernate 中,我们可以通过设置像 sessionFactory.getCurrentSession().createSQLQuery("quert").addScalar("rownum", LongType.INSTANCE).setParameter("id", id).uniqueResult(); 这样的标量来获取特定类型。这可以在 JPA 中完成吗?我在JPA中找不到public SQLQuery addScalar(String string, Type type)这样的方法。
    • This 是一个丑陋的解决方法(虽然我没有尝试过)。
    猜你喜欢
    • 1970-01-01
    • 2011-06-01
    • 1970-01-01
    • 2012-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多