diff --git a/src/test/java/com/avaje/tests/model/basic/MUser.java b/src/test/java/com/avaje/tests/model/basic/MUser.java index 1725ac692..9fee1f570 100644 --- a/src/test/java/com/avaje/tests/model/basic/MUser.java +++ b/src/test/java/com/avaje/tests/model/basic/MUser.java @@ -3,10 +3,7 @@ package com.avaje.tests.model.basic; import java.util.ArrayList; import java.util.List; -import javax.persistence.CascadeType; -import javax.persistence.Entity; -import javax.persistence.Id; -import javax.persistence.ManyToMany; +import javax.persistence.*; @Entity public class MUser { @@ -21,6 +18,9 @@ public class MUser { @ManyToMany(mappedBy="users",cascade=CascadeType.ALL) List roles; + @ManyToOne + private MUserType userType; + public MUser() { } @@ -59,5 +59,13 @@ public class MUser { } roles.add(role); } + + public MUserType getUserType() { + return userType; + } + + public void setUserType(MUserType userType) { + this.userType = userType; + } } diff --git a/src/test/java/com/avaje/tests/model/basic/MUserType.java b/src/test/java/com/avaje/tests/model/basic/MUserType.java new file mode 100644 index 000000000..6b499631a --- /dev/null +++ b/src/test/java/com/avaje/tests/model/basic/MUserType.java @@ -0,0 +1,42 @@ +package com.avaje.tests.model.basic; + +import javax.persistence.Entity; +import javax.persistence.Id; + +@Entity +public class MUserType { + + @Id + Integer id; + + String name; + + public MUserType() { + super(); + } + + public MUserType(String name) { + this.name = name; + } + + public Integer getId() { + return id; + } + + + public void setId(Integer id) { + this.id = id; + } + + + public String getName() { + return name; + } + + + public void setName(String name) { + this.name = name; + } + + +} diff --git a/src/test/java/com/avaje/tests/query/orderby/TestOrderByWithDistinct.java b/src/test/java/com/avaje/tests/query/orderby/TestOrderByWithDistinct.java new file mode 100644 index 000000000..ec579853e --- /dev/null +++ b/src/test/java/com/avaje/tests/query/orderby/TestOrderByWithDistinct.java @@ -0,0 +1,82 @@ +package com.avaje.tests.query.orderby; + +import java.util.List; + +import junit.framework.Assert; + +import org.junit.Test; + +import com.avaje.ebean.*; +import com.avaje.tests.model.basic.*; + + +public class TestOrderByWithDistinct extends BaseTestCase { + + @Test + public void test() { + /* + * Original conversation: + * https://groups.google.com/forum/?fromgroups=#!topic/ebean/uuvi1btdCDQ%5B1-25-false%5D + * + * This test exposes what may be a general problem with columns required by the order by phrase being omitted from the select. + * I'm not sure this exposes all causes of the problem. + */ + + MUserType ut = new MUserType("md"); + Ebean.save(ut); + MUser user1 = new MUser("one"); + user1.setUserType(ut); + Ebean.save(user1); + MUser user2 = new MUser("two"); + user2.setUserType(ut); + Ebean.save(user2); + + MRole roleA = new MRole("A"); + Ebean.save(roleA); + MRole roleB = new MRole("B"); + Ebean.save(roleB); + + user1.addRole(roleA); + Ebean.save(user1); + user2.addRole(roleB); + Ebean.save(user2); + + Query query = Ebean.find(MUser.class) + .where() + .eq("roles.roleName", "A") + .orderBy("userType.name, userName"); + List list = query.findList(); + + /* + * Produces this query: + select distinct t0.userid c0, t0.user_name c1, t0.user_type_id c2 + from muser t0 + join mrole_muser u1z_ on u1z_.muser_userid = t0.userid + join mrole u1 on u1.roleid = u1z_.mrole_roleid + left outer join muser_type t1 on t1.id = t0.user_type_id + where t1.name = ? and u1.role_name = ? + order by t1.name, t0.user_name + t1.name is not in select + */ + + Assert.assertEquals(1, list.size()); + Assert.assertEquals(user1, list.get(0)); + + // repeat with slight variation, not sure this really produces a different execution path + // this problem also manifests when autofetch eliminates properties from the select that aren't used in the objects + // still need them to be present for purpose of order by + // so here I'm "simulating" a scenario where autofetch has dropped userType.name + query = Ebean.find(MUser.class) + .setAutofetch(false) + .select("userName") + .where() + .eq("roles.roleName", "A") + .orderBy("userType.name"); + list = query.findList(); + + Assert.assertEquals(1, list.size()); + Assert.assertEquals(user1, list.get(0)); + + } + +}