blinkfox / fenix

This is an extension library to the Spring Data JPA complex or dynamic SQL query. 这是一个比 MyBatis 更加强大的 Spring Data JPA 扩展库,为解决复杂动态 JPQL (或 SQL) 而生。https://blinkfox.github.io/fenix
https://blinkfox.github.io/fenix
Apache License 2.0
345 stars 72 forks source link

Pageable 中有 sort字段时,生成怪异的order sql #21

Closed wenhaonan closed 3 years ago

wenhaonan commented 4 years ago

这个是最终生成的sql, 加粗倾斜的是sort的值 WHERE t.ENABLEDFLAG = 'Y', fa.accountId ASC_ ) WHERE ROWNUM <= ?

这个是fenix的xml

         WHERE
            t.ENABLED_FLAG = 'Y'
        <andLike field="t.ACCOUNT_NAME" value="criteria.accountName" match="?criteria.?accountName != empty" />
        <andLike field="t.ACCOUNT_CODE" value="criteria.accountCode" match="?criteria.?accountCode != empty" />
    </fenix>
</fenixs>
blinkfox commented 4 years ago

Fenix 中生成 分页和排序的 SQL,内部调用的也是 Spring Data JPA 的方法生成的,你这个是用的什么数据库呢,生成的确实有些奇怪。

wenhaonan commented 4 years ago

数据库是oracle

这个是完整的fenix

    <fenix id="findAccountsByComId">
        SELECT
            t.*
        FROM
            (
                SELECT
                    fa.ACCOUNT_ID,
                    fa.ACCOUNT_CODE,
                    fa.ACCOUNT_NAME,
                    fa.ENABLED_FLAG
                FROM
                    FD_ACCOUNT fa,
                    FD_ACCOUNT_SEGMENT fas
                WHERE
                    fa.ACCOUNT_ID = fas.ACCOUNT_ID
                    <andEqual field="fas.COMPANY_ID" value="criteria.companyId" match="?criteria.?companyId != empty" />
                ORDER BY
                    fa.ACCOUNT_CODE
            ) t
        WHERE
            t.ENABLED_FLAG = 'Y'
        <andLike field="t.ACCOUNT_NAME" value="criteria.accountName" match="?criteria.?accountName != empty" />
        <andLike field="t.ACCOUNT_CODE" value="criteria.accountCode" match="?criteria.?accountCode != empty" />
    </fenix>
blinkfox commented 4 years ago

这个生成是调的 JPA 的方法,你先看看执行能否成功,以及使用原生的方式生成的是什么样的,我目前没有 oracle 的库,我后续有时间试试。

dubai commented 3 years ago

也遇到同样问题,能否处理下?

pengten commented 3 years ago

@dubai 或许你可以提供下配置和SQL,以及使用的数据库和驱动版本。:)

dubai commented 3 years ago

@dubai 或许你可以提供下配置和SQL,以及使用的数据库和驱动版本。:)

找到原因了,字段名和属性一样,如果不加as别名,也会生成这种奇怪的sql

@QueryFenix(nativeQuery=true) Page page4Audit(@Param("vo") VehicleVo vo , Pageable pageable);

<fenix id="page4" resultType="com.welink.channel.modules.base.vo.VehicleVo">
    SELECT id,
   code,
   plateNum,
   useProperty,
   person,
   dealerCode,
   dealerName,
   branchCode,
   useType,
   startDate,
   type
  FROM (SELECT v.ID,
               v.CODE                       AS                               code,
               v.PLATE_NUM                  AS                               plateNum,
               v.USE_PROPERTY               AS                               useProperty,
               v.PERSON                     AS                               person,
               v.DEALER_CODE                AS                               dealerCode,
               d.NAME                       AS                               dealerName,
               v.BRANCH_CODE                AS                               branchCode,
               v.USE_TYPE                   AS                               useType,
               v.START_DATE                 AS                          startDate,
               v.type                        AS                               type
        FROM T_ORG_VEHICLE v
                 LEFT JOIN T_ORG_DEALER D ON D.IS_DELETED = 'F' AND D.CODE = v.DEALER_CODE
        WHERE v.IS_DELETED = 'F'
    )
</fenix>
blinkfox commented 3 years ago

目前先关闭这个 issue 了哈。