Método find Hibernate

El string de la consulta funciona Ok en la consola, pero en el método que realize en hibernate no esta funcionando, alguien me puede
decir como recuperar la lista de objetos apartir de ese String

Las tablas padres son compras y terceros.
La tabla union tse llama compras_terceros.

La asociación que tengo es ManyToMany con una dirección de compras a terceros.

        public static List<Compra> findAllProv(){
                String sql="select * from compras c  JOIN compras_terceros  as ct ON c.idCompra=ct.compras_idCompra AND ct.terceros_idTercero=12";
                Session session = HibernateUtil.getSessionFactory().openSession();
                Query q = session.createQuery(sql);
                return q.list();
        }

Saludos espero sus recomendaciones y ayuda :D

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.
Imagen de neko069

Será por 2 cosas 1.- Tu

Será por 2 cosas
1.- Tu consulta está hecha en SQL .... si quieres que funcione en Hibernate (o JPA) tendría que ser algo como

 from Compras c  join ComprasTerceros  ct  wherer  c.idCompra=ct.idCompra AND ct.idTercero=12

Algo así, digo, me estoy imaginando que los objetos que coloco reflejan el nombre de las tablas que tienes..
o bien,

2.-
En lugar de :

  Query q = session.createQuery(sql);

Tendría que ser

  Query q = session.createSQLQuery(sql);

Esta es mi clase compra

clase compra.

Estoy confundido neko en cual es el nombre correcto para la tabla compras_terceros, como realizar consultas a esa tabla(Desde hibernate).

package org.transacciones.dominio;

import java.util.ArrayList;
import java.util.List;
import javax.persistence.Basic;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.ManyToOne;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.validation.constraints.NotNull;

import org.hibernate.annotations.Cascade;

@Entity
@javax.persistence.Table(name="compras")
public class Compra {
private Long idCompra;
private java.util.Date fecha;
private double precio;
private String  tipo;
private int      peso;
private double total;
private List<Tercero> tercero = new ArrayList<Tercero>();
private Campo campo;
private String variedad;

@Id
@GeneratedValue
@Column(name="idCompra")
public Long getId() {
        return idCompra;
}
public void setId(Long idCompra) {
        this.idCompra = idCompra;
}
@Basic
@Temporal(TemporalType.DATE)
@Column(name="fecha")
@NotNull
public java.util.Date getFecha() {
        return fecha;
}
public void setFecha(java.util.Date fecha) {
        this.fecha = fecha;
}
@Column(name="precio")
@NotNull
public double getPrecio() {
        return precio;
}
public void setPrecio(double precio) {
        this.precio = precio;
}
@Column(name="tipo")
@NotNull
public String getTipo() {
        return tipo;
}
public void setTipo(String tipo) {
        this.tipo = tipo;
}
@Column(name="peso")
@NotNull
public int getPeso() {
        return peso;
}
public void setPeso(int peso) {
        this.peso = peso;
}
@Column(name="total")
@NotNull
public double getTotal() {
        return total;
}
public void setTotal(double total) {
        this.total = total;
}
@ManyToMany
@JoinTable(
                name="compras_terceros",
                joinColumns = { @JoinColumn(name = "compras_idCompra") },
                inverseJoinColumns = { @JoinColumn( name ="terceros_idTercero" )}
                )
@NotNull
public List<Tercero> getTercero() {
        return tercero;
}
public void setTercero(List<Tercero> tercero) {
        this.tercero = tercero;
}

@ManyToOne(cascade = {CascadeType.MERGE, CascadeType.ALL},targetEntity=Campo.class)
@Cascade( { org.hibernate.annotations.CascadeType.SAVE_UPDATE,org.hibernate.annotations.CascadeType.DELETE_ORPHAN})
@JoinColumn(name="idLote")
@NotNull
public Campo getCampo() {
        return campo;
}

public void setCampo(Campo campo) {
        this.campo = campo;
}

@Column(name="variedad")
@NotNull
public String getVariedad() {
        return variedad;
}

public void setVariedad(String variedad) {
        this.variedad = variedad;
}

}

Imagen de neko069

En ésta

En ésta relación

@ManyToMany
@JoinTable(
                name="compras_terceros",
                joinColumns = { @JoinColumn(name = "compras_idCompra") },
                inverseJoinColumns = { @JoinColumn( name ="terceros_idTercero" )}
                )

Las JoinColumn "compras_idCompra" y "terceros_idTercero" son los nombres de las columnas en la base de datos? si es así cámbialos por las propiedades del objeto que corresponde, que me imagino que son de tu clase Tercero ... y viendo tu mapeo entonces sólo necesitarías hacer el query

from Compras c where c.idCompra = :idCompra //donde el :idCompra es el id de donde quieres sacar los datos

¿Por qué se resume así? porqué en tu clase ya estás definiendo los objetos que se están relacionando, y el campo que sirve de llave foránea...