diff --git a/model/jpa/src/main/java/org/keycloak/models/jpa/entities/UserGroupMembershipEntity.java b/model/jpa/src/main/java/org/keycloak/models/jpa/entities/UserGroupMembershipEntity.java
index 9be73a9..23024fb 100755
--- a/model/jpa/src/main/java/org/keycloak/models/jpa/entities/UserGroupMembershipEntity.java
+++ b/model/jpa/src/main/java/org/keycloak/models/jpa/entities/UserGroupMembershipEntity.java
@@ -36,7 +36,7 @@ import java.io.Serializable;
@NamedQueries({
@NamedQuery(name="userMemberOf", query="select m from UserGroupMembershipEntity m where m.user = :user and m.groupId = :groupId"),
@NamedQuery(name="userGroupMembership", query="select m from UserGroupMembershipEntity m where m.user = :user"),
- @NamedQuery(name="groupMembership", query="select g.user from UserGroupMembershipEntity g where g.groupId = :groupId"),
+ @NamedQuery(name="groupMembership", query="select g.user from UserGroupMembershipEntity g where g.groupId = :groupId order by g.user.username"),
@NamedQuery(name="userGroupIds", query="select m.groupId from UserGroupMembershipEntity m where m.user = :user"),
@NamedQuery(name="deleteUserGroupMembershipByRealm", query="delete from UserGroupMembershipEntity mapping where mapping.user IN (select u from UserEntity u where u.realmId=:realmId)"),
@NamedQuery(name="deleteUserGroupMembershipsByRealmAndLink", query="delete from UserGroupMembershipEntity mapping where mapping.user IN (select u from UserEntity u where u.realmId=:realmId and u.federationLink=:link)"),
diff --git a/testsuite/integration-arquillian/tests/base/src/test/java/org/keycloak/testsuite/admin/group/GroupTest.java b/testsuite/integration-arquillian/tests/base/src/test/java/org/keycloak/testsuite/admin/group/GroupTest.java
index fd58f75..ce4539d 100755
--- a/testsuite/integration-arquillian/tests/base/src/test/java/org/keycloak/testsuite/admin/group/GroupTest.java
+++ b/testsuite/integration-arquillian/tests/base/src/test/java/org/keycloak/testsuite/admin/group/GroupTest.java
@@ -47,11 +47,13 @@ import javax.ws.rs.NotFoundException;
import javax.ws.rs.core.Response;
import java.io.IOException;
import java.net.URI;
+import java.util.ArrayList;
import java.util.Collections;
import java.util.LinkedList;
import java.util.List;
import java.util.UUID;
import javax.ws.rs.ClientErrorException;
+import javax.ws.rs.core.Response.Status;
import static org.hamcrest.Matchers.*;
import static org.junit.Assert.*;
@@ -403,6 +405,38 @@ public class GroupTest extends AbstractGroupTest {
assertNames(members, "user-b");
}
+
+ @Test
+ //KEYCLOAK-6300
+ public void groupMembershipUsersOrder() {
+ RealmResource realm = adminClient.realms().realm("test");
+
+ GroupRepresentation group = new GroupRepresentation();
+ group.setName("group");
+ String groupId = createGroup(realm, group).getId();
+
+ List<String> usernames = new ArrayList<>();
+ for (int i = 0; i < 9; i++) {
+ UserRepresentation user = UserBuilder.create().username("user" + i).build();
+ usernames.add(user.getUsername());
+
+ Response create = realm.users().create(user);
+ assertEquals(Status.CREATED, create.getStatusInfo());
+
+ String userAId = ApiUtil.getCreatedId(create);
+ realm.users().get(userAId).joinGroup(groupId);
+
+ create.close();
+ }
+
+ List<String> memberUsernames = new ArrayList<>();
+ for (UserRepresentation member : realm.groups().group(groupId).members(0, 10)) {
+ memberUsernames.add(member.getUsername());
+ }
+ assertArrayEquals("Expected: " + usernames + ", was: " + memberUsernames,
+ usernames.toArray(), memberUsernames.toArray());
+ }
+
@Test
// KEYCLOAK-2700
public void deleteRealmWithDefaultGroups() throws IOException {