Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在Ebean中对两个参数进行左连接?_Java_Sql_Left Join_Ebean_Playframework 2.3 - Fatal编程技术网

Java 如何在Ebean中对两个参数进行左连接?

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

我有两个表: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 = 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';