Bom galera, depois de muita pesquisa e várias horas tentando resolver o problema eu estou com um dilema que não consigo resolver.
Quero buscar todas as histórias que não foram respondidas por um personagem específico.
A consulta SQL basicamente seria assim (testei e funcionou):
select h.* from historia h left join historia_personagem i on i.historia_id = h.id AND i.personagem_id = '12' WHERE i.historia_id is null;
Onde ta o 12 seria passado um id dinamicamente.
Porém meu HQL não funciona de jeito algum:
public List<Historia> busca(Long personagemId) {
TypedQuery<Historia> query = (TypedQuery<Historia>) em
.createQuery("SELECT h FROM Historia h LEFT JOIN h.personagems p WITH p.id = :personagem WHERE p.historias is null");
query.setParameter("personagem", personagemId);
try {
return query.getResultList();
} catch (NoResultException e) {
return null;
}
}
Entidade História:
@Entity
@Table(name="historia")
public class Historia implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Long id;
private String texto;
//bi-directional many-to-many association to Personagem
@ManyToMany
@JoinTable(
name="historia_personagem"
, joinColumns={
@JoinColumn(name="historia_id")
}
, inverseJoinColumns={
@JoinColumn(name="personagem_id")
}
)
private List<Personagem> personagems;
public Long getId() {
return this.id;
}
public void setId(Long id) {
this.id = id;
}
public String getTexto() {
return this.texto;
}
public void setTexto(String texto) {
this.texto = texto;
}
public List<Personagem> getPersonagems() {
return this.personagems;
}
public void setPersonagems(List<Personagem> personagems) {
this.personagems = personagems;
}
}
Entidade Personagem:
@Entity
@Table(name="personagem")
public class Personagem implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Long id;
private String nome;
//bi-directional many-to-many association to Historia
@ManyToMany(mappedBy="personagems")
private List<Historia> historias;
public Long getId() {
return this.id;
}
public void setId(Long id) {
this.id = id;
}
public String getNome() {
return this.nome;
}
public void setNome(String nome) {
this.nome = nome;
}
public List<Historia> getHistorias() {
return this.historias;
}
public void setHistorias(List<Historia> historias) {
this.historias = historias;
}
}