JPQL - запрос для получения отфильтрованных строк при наличии отношений OneToMany второго уровня - PullRequest
0 голосов
/ 04 августа 2020

У меня проблема с написанием запроса 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 должен:

  1. получить все идентификаторы сообщений для данного логина и MessageUserType и вернуть только те сообщения, которые имеют MessageUserAction как завершенное.
  2. должен включить разбиение на страницы

На данный момент у меня есть только У такой запрос но он не работает: /

    @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);

Кто-нибудь может помочь?

...