查询滞后函数的房间 Dao 出错

Error in room Dao with lag function in query

我的房间 Dao 中有这个查询,其中包含 lag() 和 lead() 函数

@Query("SELECT LAG(entry_word) OVER(ORDER BY entry_word) AS previous_word, entry_word AS current_word, LEAD(entry_word) OVER(ORDER BY entry_word) AS next_word FROM entry_words WHERE entry_word = :word") List<String> getEntryWords(String word);

但是它向我显示了这个错误

我该如何解决这个问题?

编辑:我现在在使用我当前的查询时遇到此构建错误,它说返回的是列而不是行

Window 函数在 SQLite 3.25.0 版本中引入。
可能你使用的是旧版本的 SQLite,所以你不能使用 LAG()LEAD().
但是,即使你可以使用它们,你的查询也是错误的,它会 return NULL for previous_word and next_word.
这样做的原因是因为 WHERE 子句过滤了 table 并且它 returns 只有 1 行 entry_word = :word 然后 LAG()LEAD() 被应用,当然这两个 return NULL 因为结果集中没有上一行和下一行。

在这种情况下 LAG()LEAD() 的正确用法是使用子查询:

SELECT *
FROM (
  SELECT LAG(entry_word) OVER (ORDER BY entry_word) AS previous_word, 
         entry_word AS current_word, 
         LEAD(entry_word) OVER (ORDER BY entry_word) AS next_word 
  FROM entry_words 
)
WHERE current_word = :word

对于 3.25.0 之前的 SQLite 版本,您可以对相关子查询执行相同的操作:

SELECT (SELECT MAX(e2.entry_word) FROM entry_words e2 WHERE e2.entry_word < e1.entry_word) AS previous_word, 
       e1.entry_word AS current_word, 
       (SELECT MIN(e2.entry_word) FROM entry_words e2 WHERE e2.entry_word > e1.entry_word) AS next_word 
FROM entry_words e1
WHERE e1.entry_word = :word