【问题标题】:Spring - QueryDSL - SQL Server 2008 offset/limit issueSpring - QueryDSL - SQL Server 2008 偏移/限制问题
【发布时间】:2016-02-13 05:07:32
【问题描述】:


我是 QueryDSL 的新手。我在 Spring 和 SQL Server 2008 中使用 QueryDSL。 尝试执行存储过程并使用 QueryDSL 偏移量和限制对其进行分页。

首先,下面是我的处理方式:SELECT * FROM storedProcedureName() 我不确定这是实现这一目标的正确方法,因为我没有找到任何示例,但它似乎有效。

    SQLTemplates dialect = new SQLServer2005Templates();
    SQLQuery sqlQuery = new SQLQuery( dialect );
    StringExpression sp = StringTemplate.create( "storedProcedureName()" );
    StringExpression a = StringTemplate.create( "*" );
    sqlQuery.from( sp );

    ArrayList<Sd> _Mapping = (ArrayList<Sd>) queryDslJdbcTemplate.query(
            sqlQuery,
            new SdRowMapper(), a );

为了处理分页,我只添加了 offset 和 limit 方法:sqlQuery.from( sp ).offset(5).limit(10) 。 但我收到“排名函数“row_number”必须有 ORDER BY 子句”错误。

select * from (select row_number() over () as rn 来自storedProcedureName()) a where rn > ?和 rn

所以我确定我的做法不对。任何人都可以帮忙吗?

【问题讨论】:

  • 对不起,它不是一个存储过程,而是一个表值函数。所以我使用该链接做了一些正确的事情:github.com/querydsl/querydsl/issues/35
    RelationalFunctionCall functionCall = RelationalFunctionCall.create(String.class, "functionName");但是我仍然对分页方法有同样的问题..(我认为这是因为 order 子句是空的:
    [ select row_number() over ( ..ID here.. ) ] .
    我猜这是空的,因为当 QueryDSL 生成查询时,它正在寻找一种ID,因为没有定义,所以没有找到..
  • 所以如果我是对的,我应该想办法在Order by子句中手动定义列来设置它。关于查询投影,即使使用
    @987654324 @
    似乎可以工作,我认为这不是一个好主意,但我这样定义它,因为我没有找到使用返回表.all() .. 并且使用 Spring 和 QueryDslJdbcTemplate, list(projection...) 方法从 AbstractSQLQuery 引发空异常。可能是因为我没有在 SQLQuery 构造函数中设置任何 Connection arg。我知道这是很多猜测..

标签: spring limit offset querydsl


【解决方案1】:

您需要提供 orderBy 信息才能使查询生效。

【讨论】:

    猜你喜欢
    • 2015-10-08
    • 2018-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多