У меня проблема с написанием запроса JPQL, в котором я должен фильтровать сущность «Сообщение» только тогда, когда «MessageUserAction» имеет значение. Для меня сложно то, что «MessageUserAction» имеет отношение ManyToOne к «MessageUser» (а не «Message»), а затем «MessageUser» имеет отношение ManyToOne к «Message», поэтому, другими словами, я должен фильтровать «Сообщение» на основе отношений OneToMany. на втором уровне.
Ниже я привожу образец структуры сущностей:
Сущность сообщения:
`@Entity publi c class Message {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
private String subject;
private String body;
@OneToMany(mappedBy = "message")
private List<MessageUser> messageUsers = new ArrayList<>();
} `Сущность MessageUser -> Сообщение имеет отношение OneToMany к сущности MessageUser.
` @Entity publi c class MessageUser {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
private String login;
private String email;
@Enumerated(EnumType.String)
private MessageUserType type;
@ManyToOne
private Message message;
@OneToMany(mappedBy = "messageUser")
private List<MessageUserAction> userActions = new ArrayList<>();
} `
MessageUserAction -> MessageUser имеет отношения OneToMany к MessageUserAction
@ Entity publi c class MessageUserAction {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
private String action;
}
Запрос JPQL должен:
- получить все идентификаторы сообщений для данного логина и MessageUserType и вернуть только те сообщения, которые имеют MessageUserAction как завершенное.
- должен включить разбиение на страницы
На данный момент у меня есть только У такой запрос но он не работает: /
@Query(value = "select message.id from Message message "
+ "left join fetch MessageUser as user on user.message.id = message.id "
+ "left join fetch MessageUserAction as action on action.messageUser.id = user.id "
+ "where user.userActions.size = ("
+ "select count(action2.id) from MessageUserAction action2 "
+ "where action2.status = 'COMPLETED')"
+ "and upper(user.login) = upper(:login) "
+ "and upper.userType in :userTypes")
Page<Long> findAllCompletedMessagesIds(
@Param("login") String login,
@Param("messageUserTypes") List<MessageUserType> userTypes,
Pageable pageable);
Кто-нибудь может помочь?