diff --git a/search/src/main/java/org/zstack/query/MysqlQueryBuilderImpl3.java b/search/src/main/java/org/zstack/query/MysqlQueryBuilderImpl3.java index 1f1c2abd816..6ab094b71aa 100755 --- a/search/src/main/java/org/zstack/query/MysqlQueryBuilderImpl3.java +++ b/search/src/main/java/org/zstack/query/MysqlQueryBuilderImpl3.java @@ -730,7 +730,15 @@ String toJpql(boolean isCount) { throw new IllegalArgumentException(String.format("illegal sortBy[%s], entity[%s] doesn't have this field", msg.getSortBy(), info.entityClass.getName())); } - ret = String.format("%s order by %s.%s %s", ret, entityName, msg.getSortBy(), msg.getSortDirection().toUpperCase()); + if ("uuid".equals(msg.getSortBy())) { + ret = String.format("%s order by %s.%s %s", ret, entityName, msg.getSortBy(), msg.getSortDirection().toUpperCase()); + } else { + // 追加 uuid 作为 tiebreaker,确保排序稳定 + ret = String.format("%s order by %s.%s %s, %s.uuid ASC", ret, entityName, msg.getSortBy(), msg.getSortDirection().toUpperCase(), entityName); + } + } else if (!msg.isCount()) { + // 无排序字段时添加默认排序 + ret = String.format("%s order by %s.uuid ASC", ret, entityName); } if (msg.getGroupBy() != null) { diff --git a/search/src/main/java/org/zstack/query/QueryFacadeImpl.java b/search/src/main/java/org/zstack/query/QueryFacadeImpl.java index 3a0a291b1bc..80a837d3b46 100755 --- a/search/src/main/java/org/zstack/query/QueryFacadeImpl.java +++ b/search/src/main/java/org/zstack/query/QueryFacadeImpl.java @@ -483,7 +483,15 @@ public ZQLQueryReturn queryUseZQL(APIQueryMessage msg, Class inventoryClass) { } if (msg.getSortBy() != null) { - sb.add(String.format("order by %s %s", msg.getSortBy(), msg.getSortDirection())); + if ("uuid".equals(msg.getSortBy())) { + sb.add(String.format("order by %s %s", msg.getSortBy(), msg.getSortDirection())); + } else { + // 追加 uuid 作为 tiebreaker,确保排序稳定 + sb.add(String.format("order by %s %s, uuid asc", msg.getSortBy(), msg.getSortDirection())); + } + } else if (!msg.isCount()) { + // 无排序字段时添加默认排序 + sb.add("order by uuid asc"); } if (msg.getLimit() != null) {