Primeiramente seguem minhas classes:
@Entity
@Table(name = "ocorrencia")
public class Ocorrencia {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@NotNull
@ManyToOne
@JoinColumn(name = "usuariocoleta_id")
private Usuario usuarioColeta;
@NotNull
@ManyToOne
@JoinColumn(name = "cargo_id")
private Cargo cargo;
@JsonManagedReference
@OneToMany(mappedBy = "ocorrencia")
private List<OcorrenciaAcompanhante> acompanhantes;
}
@Entity
@Table(name = "ocorrencia_acompanhante")
public class OcorrenciaAcompanhante {
@EmbeddedId
private OcorrenciaAcompanhanteId id;
@JsonBackReference
@ManyToOne
@MapsId("ocorrenciaId")
private Ocorrencia ocorrencia;
@ManyToOne
@MapsId("usuarioId")
private Usuario usuario;
@ManyToOne
@JoinColumn(name = "cargo_id")
private Cargo cargo;
}
Existe um relacionamento ManyToMany entre as classes. Foi necessário criar uma classe para OcorrenciaAcompanhante pois precisava adicionar uma coluna extra ao relacionamento, que é a coluna Cargo. Basicamente funciona assim: para cada ocorrência, existe um usuário que faz o registro (usuarioColeta) e outros que o acompanham (acompanhantes). Para cada acompanhante, preciso registrar o cargo dele, assim como registro o cargo do usuário que fez o registro (coluna Cargo da classe Ocorrência).
Sabendo disso, preciso efetuar uma consulta na base de dados através de JPA, em que seja possível retornar as ocorrências onde um determinado usuário seja o usuário de registro (usuarioColeta) ou seja um dos acompanhantes.
Pensei em usar isMember, porém me deparei com a seguinte situação:
builder.or(builder.equal(root.get(Ocorrencia_.usuarioColeta), ocorrenciaFilter.getUsuarioColeta()),
builder.isMember(ocorrenciaFilter.getUsuarioColeta(), root.get(Ocorrencia_.acompanhantes)))
O problema é que o isMember não está sendo possível, pois estou comparando um objeto do tipo Usuario com uma coleção de objetos do tipo OcorrenciaAcompanhante, em que usuário é um dos atributos de cada objeto dessa coleção, conforme mostra a classe OcorrenciaAcompanhante.
Diante disso, alguém tem alguma dica que possa me ajudar? Agradeço muito.