私は、Play Framework 2 で使用されるEbean ORM 永続層の世界ではまったく新しいものです。私の第一印象は非常に良いですが、私の趣味のプロジェクトで、解決方法がわからない問題に出くわしました。何か間違ったことがあるのか (モデル?)、それとも単に Ebean に関する知識が不足しているだけなのかはわかりません。
と の 2 つのモデルがUser
ありUserAccount
ます。
User
アカウントを持っている場合と持っていない場合があります。UserAccount
は常に正確に 1 つを指しUser
ます。
だからUser
モデルがあります:
@Entity
public class User extends Model {
@Id
private Long id;
@NotNull
private String name;
@NotNull
private String surname;
@OneToOne(cascade=CascadeType.ALL, mappedBy = "user")
private UserAccount userAccount;
public static Finder<Long, User> find = new Finder<>(
Long.class, User.class
);
// ... Getters and Setters ...
}
モデルがありUserAccount
ます:
@Entity
public class UserAccount extends Model {
@Id
private Long id;
@NotNull
private String username;
@NotNull
private String password;
@NotNull
@OneToOne
@JoinColumn(name = "user_id")
private User user;
public static Finder<Long, UserAccount> find = new Finder<>(
Long.class, UserAccount.class
);
// ... Getters and Setters ...
}
私がやりたいことは、アカウントの有無にかかわらずすべてのユーザーを取得することです。
このコードでうまくいくと確信していました:
User.find.all();
...しかし、驚いたことに、アカウント レコードが関連付けられているユーザーのみが返されました。
もう 1 つの興味深い点は、次の呼び出しです。
User.find.findRowCount();
...アカウントのあるユーザーとないユーザーの実際の数を返したので、これらのクエリの両方が機能することを期待していたように機能します。
それで、私はそこに何が欠けていますか?私のモデルに何か問題がありますか? すべてのユーザーが返されないのはなぜですか?
[編集]
もう少し情報を添付します。
実行された SQL:
User.find.findRowCount();
は:
select count(*) from user t0
実行された SQL:
User.find.all();
は
select t0.id c0, t0.name c1, t0.surname c2, t1.id c3 from user t0 join user_account t1 on t1.user_id = t0.id
左結合の代わりに内部結合が使用されているように見えます。この理由は何ですか?