我在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 for:
User.find.findRowCount();
是:
select count(*) from user t0
执行SQL for:
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
在我看来,使用内连接而不是左连接。这是什么原因?
答案 0 :(得分:0)
在您的用户课程中,您使用 mappedBy =“user”作为列名,但在 UserAccount 类中,您使用 name = “USER_ID”即可。