按升序或降序变量排序的房间DAO订单

41

我正在尝试在我的@Dao接口中创建一个@Query函数,该函数具有布尔参数isAsc来确定顺序:

@Query("SELECT * FROM Persons ORDER BY first_name (:isAsc ? ASC : DESC)")
List<Person> getPersonsAlphabetically(boolean isAsc);

显然这是不允许的。这里有什么变通方法吗?

编辑:

使用两个查询似乎很奇怪(如下),因为唯一的区别是ASCDESC

@Query("SELECT * FROM Persons ORDER BY last_name ASC")
List<Person> getPersonsSortByAscLastName();

@Query("SELECT * FROM Persons ORDER BY last_name DESC")
List<Person> getPersonsSortByDescLastName();
3个回答

66

使用SQLite中的CASE表达式来在Room DAO中实现这一点。

@Query("SELECT * FROM Persons ORDER BY 
        CASE WHEN :isAsc = 1 THEN first_name END ASC, 
        CASE WHEN :isAsc = 0 THEN first_name END DESC")
List<Person> getPersonsAlphabetically(boolean isAsc);

请注意,SQLite查询优化器无法正确地对其进行优化。它将始终生成一个临时B-Tree。这在使用Android提供的旧版本SQLite时尤为明显。 - HSchmale

14
创建两个查询,一个使用ASC,另一个使用DESC。
@Query("SELECT * FROM Persons ORDER BY last_name ASC")
List<Person> getPersonsSortByAscLastName();

@Query("SELECT * FROM Persons ORDER BY last_name DESC")
List<Person> getPersonsSortByDescLastName();

9
对我来说,这似乎很奇怪,创建两个查询,唯一的区别是 ASC 和 DESC。 - aLL
1
看来这不是你正在寻找的解决方案。 - Amin Keshavarzian

-8

为什么不试试这个?我还没有测试过。

@Query("SELECT * FROM Persons ORDER BY first_name :order")
List<Person> getPersonsAlphabetically(String order);

你建议的逻辑应该在查询之前执行。


尝试过了,不起作用。出现错误:需要逗号、句点、ASC、BETWEEN、COLLATE、DESC、IN、LIMIT或分号,但得到的是“:order”。此外,由于“ACS”和“DECS”的缘故,这容易出错。你知道的。 - aLL
你确定你写得没问题吗? - Miguel Isla
此外,这种代码不比其他需要手动编写 ASC 或 DESC 的代码更容易出错,就像您的示例一样... - Miguel Isla
它在这里写得很好,但出现了相同的错误。IDE能够轻松解释SQL查询语句,并期望在ORDER BY之后使用保留的SQL关键词而不是字符串变量。布尔变量将减少代码出错的可能性,甚至完全消除它们。 - aLL
我猜你所要求的无法实现。很抱歉听到这个消息。布尔值可以减少或消除容易出错的代码,我同意;但是你的例子和我的例子完全相同,因为你必须从布尔值转换为字符串。这就是我在之前评论中所说的意思。 - Miguel Isla
5
我喜欢这种回答,因为它们往往是错误的,但教会我们如何做不应该做的事情!请不要删除这个(试图回答的)答案。 - Zun

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接