我正在为事件管理应用程序构建REST服务。 这个想法是,每个用户只能在Feed上看到他被邀请参加的事件和他创建的事件。一个条件是每个用户都有多封电子邮件。 为特定(已认证)用户(通过JpaRepository)检索事件的最佳方法是什么?
我想到的一种可能的解决方案是进行如下查询,其中:auth_email和:auth_id是已验证用户的电子邮件和ID。
SELECT e.* FROM events e
WHERE e.user_id = :auth_id OR
EXISTS (
SELECT id FROM invitations
WHERE (e.id = invitations.event_id) AND
(
invitations.email = :auth_email
OR EXISTS (
SELECT id FROM user_emails WHERE
(user_emails.user_id = :auth_id)
AND (invitations.email = user_emails.email)
)
)
)
我不确定它是否可扩展,也不确定如何将其“转换”为JPQL ...
我有大概的型号:
@Data @Entity @Table(name = "users")
public class User {
@Id @GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(unique = true, nullable = false)
private String email;
// other columns
}
@Data @Entity @Table(name = "user_emails")
public class UserEmails {
@Id @GeneratedValue(strategy = GenerationType.IDENTITY)
private long id;
@ManyToOne
private User user;
@Column(unique = true, nullable = false)
private String email;
}
@Data @Entity @Table(name = "events")
public class Event {
@Id @GeneratedValue(strategy = GenerationType.IDENTITY)
private long id;
@ManyToOne
private User user;
@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true)
@JoinColumn(name = "event_id") @JsonIgnore
private List<Invitation> invitations;
private String title;
// other columns
}
@Data @Entity @Table(name = "invitations")
public class Invitation {
@Id @GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String email;
@ManyToOne @JsonIgnore
private Event event;
}