ORMLite orderBy 多列不起作用
ORMLite orderBy multiple columns not working
我在通过 ORMLite 查询要按 2 个单独的列排序的对象列表时遇到问题。我想按优先级最低和计数最高来排序。但是,查询似乎只接受我设置的最后一个 orderBy 而不是两者。例如,这里有两个查询及其结果:
QueryBuilder<CategoryData, Integer> queryBuilder4 = dao.queryBuilder();
queryBuilder4.orderBy(CategoryData.FACE_COUNT_COLUMN_NAME, false);
queryBuilder4.orderBy(CategoryData.PRIORITY_COLUMN_NAME, true);
Log.d(TAG, "4 Query returns:"+ queryBuilder4.query().toString());
它的输出:
name=Blues, db=158, count=3, priority=1, firstLookDbID=6
name=Greens, db=165, count=3, priority=8, firstLookDbID=9
name=Blacks, db=157, count=1, priority=0, firstLookDbID=2,...
第二个代码块:
QueryBuilder<CategoryData, Integer> queryBuilder5 = dao.queryBuilder();
queryBuilder5.orderBy(CategoryData.PRIORITY_COLUMN_NAME, true);
queryBuilder5.orderBy(CategoryData.FACE_COUNT_COLUMN_NAME, false);
Log.d(TAG, "5 Query returns:"+ queryBuilder5.query().toString());
它的输出是:
name=Blacks, db=157, count=1, priority=0, firstLookDbID=2
name=Blues, db=158, count=3, priority=1, firstLookDbID=6
...
name=Greens, db=165, count=3, priority=8, firstLookDbID=9...
请注意,这两个查询之间的唯一区别是我放置 orderBys 的顺序。但是他们给了我 2 个不同的有序集合。
您的第一个查询 (queryBuilder4) 按 FACE_COUNT_COLUMN_NAME 以后代方式对结果进行排序,如果存在相同的值,在本例中为“count = 3”,则查询使用 PRIORITY_COLUMN_NAME 来结果按“优先级”从小到大排序
第二个查询(queryBuilder5)按PRIORITY_COLUMN_NAME对结果进行升序排序,但在“priority”中不存在相同的值,因此"order by FACE_COUNT_COLUMN_NAME"被忽略并且结果与第一个查询不同。
Notice the only difference between the two queries is the order I put the orderBys. However they give me 2 different ordered sets.
对。这是预期的行为。在 SQL 中,ORDER BY
子句按特定顺序处理。重点引用 QueryBuilder.orderby(...)
javadocs:
Add "ORDER BY" clause to the SQL query statement. This can be called multiple times to add additional "ORDER BY" clauses. Ones earlier are applied first.
所以在第一个实例中,FACE_COUNT_COLUMN_NAME
首先降序排列。如果计数相等,则 PRIORITY_COLUMN_NAME
按升序排列。在第二种情况下,优先级首先按升序排列。如果优先级相等,则计数降序排列。
我在通过 ORMLite 查询要按 2 个单独的列排序的对象列表时遇到问题。我想按优先级最低和计数最高来排序。但是,查询似乎只接受我设置的最后一个 orderBy 而不是两者。例如,这里有两个查询及其结果:
QueryBuilder<CategoryData, Integer> queryBuilder4 = dao.queryBuilder();
queryBuilder4.orderBy(CategoryData.FACE_COUNT_COLUMN_NAME, false);
queryBuilder4.orderBy(CategoryData.PRIORITY_COLUMN_NAME, true);
Log.d(TAG, "4 Query returns:"+ queryBuilder4.query().toString());
它的输出:
name=Blues, db=158, count=3, priority=1, firstLookDbID=6
name=Greens, db=165, count=3, priority=8, firstLookDbID=9
name=Blacks, db=157, count=1, priority=0, firstLookDbID=2,...
第二个代码块:
QueryBuilder<CategoryData, Integer> queryBuilder5 = dao.queryBuilder();
queryBuilder5.orderBy(CategoryData.PRIORITY_COLUMN_NAME, true);
queryBuilder5.orderBy(CategoryData.FACE_COUNT_COLUMN_NAME, false);
Log.d(TAG, "5 Query returns:"+ queryBuilder5.query().toString());
它的输出是:
name=Blacks, db=157, count=1, priority=0, firstLookDbID=2
name=Blues, db=158, count=3, priority=1, firstLookDbID=6
...
name=Greens, db=165, count=3, priority=8, firstLookDbID=9...
请注意,这两个查询之间的唯一区别是我放置 orderBys 的顺序。但是他们给了我 2 个不同的有序集合。
您的第一个查询 (queryBuilder4) 按 FACE_COUNT_COLUMN_NAME 以后代方式对结果进行排序,如果存在相同的值,在本例中为“count = 3”,则查询使用 PRIORITY_COLUMN_NAME 来结果按“优先级”从小到大排序
第二个查询(queryBuilder5)按PRIORITY_COLUMN_NAME对结果进行升序排序,但在“priority”中不存在相同的值,因此"order by FACE_COUNT_COLUMN_NAME"被忽略并且结果与第一个查询不同。
Notice the only difference between the two queries is the order I put the orderBys. However they give me 2 different ordered sets.
对。这是预期的行为。在 SQL 中,ORDER BY
子句按特定顺序处理。重点引用 QueryBuilder.orderby(...)
javadocs:
Add "ORDER BY" clause to the SQL query statement. This can be called multiple times to add additional "ORDER BY" clauses. Ones earlier are applied first.
所以在第一个实例中,FACE_COUNT_COLUMN_NAME
首先降序排列。如果计数相等,则 PRIORITY_COLUMN_NAME
按升序排列。在第二种情况下,优先级首先按升序排列。如果优先级相等,则计数降序排列。