我对 Play Framework 2 中使用的Ebean ORM 持久层的世界是全新的。我最初的印象非常好,但在我的爱好项目中,我偶然发现了我不知道如何解决的问题。我不确定我是否做错了什么(模型?)或者只是缺乏我对 Ebean 的了解。
我有两个模型:User
和UserAccount
:
User
可能有也可能没有帐户。UserAccount
总是指向一个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();
...但令我惊讶的是,只返回了具有关联帐户记录的用户。
另一个有趣的事情是这个调用:
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
在我看来,使用内连接而不是左连接。这是什么原因?