Java 如何在Ebean中对两个参数进行左连接?
我有两个表:users和mail_list以及相应的类。 这些表通过引用users表中id的mail_列表表中的外键user_id进行连接。用户在邮件列表表中可以有两种记录-“常规”或/和“管理员”。若用户在邮件列表表中有记录,这意味着他不想收到相应种类的邮件。 我想找到所有想要接收普通邮件的用户。我确信正确的SQL查询如下所示:Java 如何在Ebean中对两个参数进行左连接?,java,sql,left-join,ebean,playframework-2.3,Java,Sql,Left Join,Ebean,Playframework 2.3,我有两个表:users和mail_list以及相应的类。 这些表通过引用users表中id的mail_列表表中的外键user_id进行连接。用户在邮件列表表中可以有两种记录-“常规”或/和“管理员”。若用户在邮件列表表中有记录,这意味着他不想收到相应种类的邮件。 我想找到所有想要接收普通邮件的用户。我确信正确的SQL查询如下所示: SELECT U.id, U.email, M.user_id, M.kind FROM users U LEFT JOIN mail_list M ON (U.id
SELECT U.id, U.email, M.user_id, M.kind
FROM users U
LEFT JOIN mail_list M
ON (U.id = M.user_id AND M.kind = 'general')
WHERE M.user_id IS NULL
但不幸的是,我和埃宾不太好。如果可能的话,你能帮我写一个这样的Ebean查询吗?我希望避免使用原始SQL
在这里,我的类的一些代码是:
@Entity
@Table(name = "users")
public class User {
@Id
public Long id;
public String email;
@OneToMany(mappedBy = "user")
public List<MailList> mailLists;
}
@Entity
@Table(name = "mail_list")
public class MailList {
@Id
public Long id;
/**
* Kind of mail list
*/
public String kind;
public static String GENERAL = "general";
public static String ADMIN = "admin";
@ManyToOne
public User user;
}
我使用PlayFramework 2.2.3。我对您的问题的解决方案是:
List<MailList> mailList = MailList.find.where().like("kind", "general").findList();
Set<User> userSet = new HashSet<User>();
for(MailList mail:mailList)
userSet.add(mail.user);
它查找满足搜索条件的邮件列表。然后创建一组用户。我想这就是您要寻找的:
Finder<Long, User> finder = new Finder<Long, User>(Long.class, User.class);
List<User> users = finder.fetch("mailLists").where().eq("mailLists.kind", "general").findList();
我建议您使用enum而不是静态字符串。这将更好地参考您的源代码
关于你的问题,我没有理解的唯一部分是,你使用一个字段来连接一个表,但在这个表中,你过滤该字段的空值。我认为你的SQL中有一个错误的观点。为什么要使用连接表的字段,以及在何处筛选空ID?此查询:从U LEFT JOIN mail_列表中选择U.id、U.email、M.user_id、M.kind,U.id=M.user_id和M.kind='general',其中M.user_id为空。这一部分毫无意义。
SELECT U.id, U.email, M.user_id, M.kind
FROM users U
LEFT JOIN mail_list M ON U.id = M.user_id
WHERE M.kind = 'general';