Quiero hacer algo como eso con HQL:

SELECT *
FROM tableA a
INNER JOIN (select fieldA, sum(fieldB) as sum from tableB) b
ON a.fieldA = b.fieldA and a.fieldC = b.sum;

Pero esto da un error:

org.hibernate.hql.internal.ast.QuerySyntaxException: unexpected token: (...

Hay alguna manera de hacer esto usando HQL y de Hibernación?

  • No, HQL no permite interior selecciona en esa posición. Puede haber una manera de decir que, a pesar de que.
InformationsquelleAutor Montolide | 2012-08-02

3 Comentarios

  1. 7

    probar el SQL nativo enfoque de solución:

    necesidad toimport esto primero:

    import org.hibernate.SQLQuery;

    entonces en algún lugar en el código:

    SQLQuery query = session.createSQLQuery(
        "SELECT * FROM tableA a
        INNER JOIN 
        (SELECT fieldA, sum(fieldB) as sum from tableB) b
        ON a.fieldA = b.fieldA and a.fieldC = b.sum"
    );

    más información en este enlace

    y AQUÍ (
    Se une en Hibernate Query Language)

    • Sí, nativo puede ser una solución, pero me encantaría un HQL solución, no hay ninguna? 🙁
    • Sólo trató de la solución con el SQL, y lo que yo no sabía es que se puede establecer el resultado a una entidad que utiliza query.addEntity(TableA.class), o de lo contrario el resultado sería una matriz de Objetos. Así de esta manera funciona perfecto para mí. Gracias!
  2. 3

    Usted puede tratar de hacer tal cosa con HQL:

    String sqlText = 
            "select entityA 
             from EntityA entityA, EntityB entityB 
             where entityA.fieldA=entityB.fieldA 
             and entityA.fieldC=(select sum(entityB.fieldB) 
                                 from EntityB entityB 
                                 where entityB.fieldA=entityA.fieldA)"
    
    Query query = session.createQuery(sqlText);

    Debería funcionar de forma similar a sql. Acerca de su declaración – como sé que no uso interior en HQL porque es orientado a objetos.

    Aquí es una buena artículo acerca de las combinaciones en HQL.

    EDICIÓN:

    De acuerdo a las notas de user1495181 consulta anterior se puede reescribir como (pero no estoy seguro):

    String sqlText = 
            "select entityA 
             from EntityA entityA
             join entityA.entitiesB entityB
             Where entityA.fieldC=(select sum(entityB.fieldB) 
                                 from EntityB entityB 
                                 where entityB.fieldA=entityA.fieldA)"

    Pero yo prefiero la primera variante, porque para mí es más comprensible (en particular para los pueblos que se utiliza para trabajar con SQL nativo).

    • Si tienes relación entre a Y B puede utilizar unirse a unirse a ellos y poner solo el estado en el donde.
    • Gracias por edición). Me perdí a cambiar y en donde.
    • Me gusta la manera de reescribir la hql, pero no estoy seguro de si iba a funcionar para mi caso (que es más complejo de lo que mi consulta de ejemplo :P). Utilizando el lenguaje SQL es mejor para mí, en este caso 😉
  3. 1

    No se puede definir la combinación con la palabra clave. Hibernate saber cómo hacer la combinación basada en su asignación.
    Si se define una relación en la correlación entre a y b de hibernate hacer la combinación basada en la relación que usted ha definido.
    Si tienes relación entre a y b que hacer inner join sin usar y poner los criterios de combinación en la cláusula where

    • Por favor, puedes elaborar más?
    • Supongamos que usted tiene Manager(1:m)Employe. La relación entre ellos es definido en el mapeo hibernate (uno-a-muchos), así que cuando usted quiere consultar el administrador de que su empleado tiene un sueldo mayor que 100 que usted no necesita especificar la relación en la consulta como en la consulta SQL con la combinación …en. Con hibernate query ‘desde el administrador de m unirse m.empleado e, donde e. sueldo > 100 (yo no especificar cómo hacer la combinación . hibernate conocemos por la asignación). Sin embargo, si su ingreso no será definido en la asignación (y no de la buena práctica) que usted puede hacer explícito unirse en donde:
    • desde el Administrador de m,Empleado e donde m.id = e.manager_id

Dejar respuesta

Please enter your comment!
Please enter your name here