【问题标题】:How to make left join on two parameters in Ebean?如何在 Ebean 中的两个参数上进行左连接?
【发布时间】:2014-08-08 09:59:53
【问题描述】:

我有两个表:“users”和“mail_list”以及相应的类。
这些表通过引用id(在用户表中)的外键user_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 查询吗?我想避免使用原始 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。

【问题讨论】:

  • 我认为您的 SQL 中有一个错误点。为什么要在连接表中使用字段以及在哪里过滤空 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空值”。 where 部分没有意义。

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


【解决方案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);

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

【讨论】:

    【解决方案2】:

    我想这就是你要找的东西:

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

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

    我在您的问题中不理解的独特部分是您使用字段连接表的部分,但在您过滤该字段的空值的位置。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-28
      • 1970-01-01
      • 2019-11-17
      • 1970-01-01
      相关资源
      最近更新 更多