環境
- PlayFramework 2.4
- Java 8
状況
クラスが2つ存在しており、それぞれのクラスの構成は以下のようになっている(一部抜粋)
<User>
public class User extends Model{ @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private long id; @OneToMany(cascade = CascadeType.ALL, mappedBy = "user") private List<UserSkill> userSkillList; }
<UserSkill>
public class UserSkill extends Model{ @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private long id; @ManyToOne(cascade = CascadeType.ALL) private User user; @ManyToOne(cascade = CascadeType.ALL) private Skill skill; private int level; // スキルのレベルが1〜100で入るとする }
<Skill>
public class User extends Model{ @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private long id; @OneToMany(cascade = CascadeType.ALL, mappedBy = "skill") private List<UserSkill> userSkillList; private String name; }
やりたいこと
現在このようなデータがUserSkillに入っているとします
id | skill_id | user_id | level |
---|---|---|---|
1 | 1 | 1 | 10 |
2 | 2 | 1 | 50 |
3 | 3 | 1 | 60 |
4 | 1 | 2 | 70 |
5 | 1 | 3 | 30 |
6 | 2 | 2 | 40 |
7 | 1 | 4 | 80 |
その時に以下の要件でデータを取得してきたいです。
- 特定のスキル(今回はSkillのidが1)を持っているユーザーの一覧を取得したい
- その際、ページングをしたいので、findPagedList()で取得範囲を指定したい
- levelが高い順にソートしたい
その時のEbeanのコードが以下の通りです。
PagedList<User> userList = find.where().eq("skill", skill).order().desc("userSkillList.level").findPagedList(index, size);
問題点
desc("userSkillList.level")とやってしまうことで、fetchされてしまい、eq("skill",skill)で検索したことが無効化されてしまい、全件表示されてしまいます。
何かいい方法を知っている方がいらっしゃったら、ご教授ください。
よろしくお願い致します。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。