SQL Server 使用Spring Data 存储库的QueryDSL predicate -在WHERE子句中将时间戳转换为varchar

huus2vyu  于 2023-01-12  发布在  Spring
关注(0)|答案(1)|浏览(154)

我正在编写从SQL Server DB获取数据的Java代码。我正在使用Spring Data 存储库和QueryDSL predicate 以及findAll(Predicate ..)
我需要在下面的WHERE子句中实现:
WHERE CONVERT(nvarchar(24),myTable.Time_Stamp,21) > "some date as string"
它在SQL Server Studio中作为SQL工作。
下面是我在QueryDSL中定义 predicate 的方法:
BooleanExpression nextEvents = Expressions.stringTemplate("CONVERT({0}, {1}, {2})","nvarchar(24)", myTable.timeStamp, "21").gt("some date as string");
我得到了以下异常:
Incorrect syntax near '@P0'.
下面是查询的where调用和Hibernate生成的绑定:

where CONVERT(?, unifiedent0_.Time_Stamp, ?)>? order by unifiedent0_.Time_Stamp asc offset 0 rows fetch next ? rows only
: binding parameter [1] as [VARCHAR] - [nvarchar(24)]
: binding parameter [2] as [VARCHAR] - [21]
: binding parameter [3] as [VARCHAR] - [2022-09-20 09:56:32.077-113]

在我看来,这一切都是正确的:3?我期望看到的标志和装订。
queryDSL表达式有什么问题?
谢谢你。

ymzxtsji

ymzxtsji1#

我决定放弃QueryDSL而使用JPQL。
它起作用了。
查询为:

@Query("SELECT uem FROM UnifiedEntityMessage uem "
            + "WHERE convert(nvarchar(24),uem.timeStamp,21) + '-' + trim(str(uem.id)) > :lastSentCompositeKey "
            + "and uem.pId in :pids "
            + "and uem.timeStamp < :before "
            + "and uem.type <> :type")

相关问题