[RESOLVIDO] Many-To-Many Bidirecional

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;
	}
}


Prometo que se você falar o erro fica mais fácil de ajudar! =D

Rsrs desculpa!

O problema é que não da erro, porém não retorna nenhum resultado.

Supondo que eu tenha 10 histórias cadastradas, e o personagem responde 1 com essa consulta era para retornar apenas 9 que ele ainda não respondeu.

Entendeu?

WHERE i.historia_id is null;  

Tem certeza que para buscar todas as histórias que não foram respondidas por um personagem específico, a condição é essa ?

[quote=onjacktallcuca] WHERE i.historia_id is null;

Tem certeza que para buscar todas as histórias que não foram respondidas por um personagem específico, a condição é essa ? [/quote]

Bom fiz um teste no banco de dados, inseri algumas histórias e um personagem… E fiz a ligação desse personagem com algumas histórias.
E rodando essa consulta ele me retornou apenas as histórias que o personagem não tinha respondido. Então suponho que esteja correta.

Pode me ajudar?

Consegui resolver aqui galera, a HQL ficou assim: