如何在Ebean中的两个参数上进行左连接?

时间:2014-08-08 09:59:53

标签: java sql left-join ebean playframework-2.3

我有两张桌子:"用户"和" mail_list"与相应的班级 这些表通过引用user_id(在users表中)的外键id(在mail_list表中)的帮助进行连接。用户可以在mail_list表中记录两个kinds - ' general'或/和' admin'。如果用户在mail_list表中有记录,这意味着他不想收到相应类型的邮件。
我想找到所有想要收到一般邮件的用户。我确定正确的SQL查询如下所示:

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不太好。请问,如果有可能,请帮我写一个这样的Ebean查询?我想避免使用Raw 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。

2 个答案:

答案 0 :(得分:1)

我的解决方案是:

List<MailList> mailList = MailList.find.where().like("kind", "general").findList();     
Set<User> userSet = new HashSet<User>();
for(MailList mail:mailList)
    userSet.add(mail.user);

它找到符合搜索条件的邮件列表。然后它创建一组用户。

答案 1 :(得分:0)

我认为这就是你要找的东西:

    Finder<Long, User> finder = new Finder<Long, User>(Long.class, User.class);
    List<User> users = finder.fetch("mailLists").where().eq("mailLists.kind", "general").findList();

此代码将生成以下查询:

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';

我建议您使用枚举而不是静态字符串。这将更好地参考您的源代码。

我在你的问题上没有理解的独特部分是你使用字段来连接表格的部分,但是你在那里过滤该字段的空值。