two tables subconsultas persistencia left ejemplos ejemplo hibernate criteria

tables - persistencia hibernate



Hibernate consulta un campo de clave externa con ID (2)

Por ejemplo, tengo dos entidades: Empleado y Dirección. De estas entidades, el empleado tiene una clave externa. AddressID hace referencia a la columna ID en Address. En los objetos de dominio de Java, Hibernate ajusta muy bien el campo entero de clave forgein con un campo de objeto Dirección. Pero ahora, ¿cómo podría consultar al Empleado con un cierto AddressID?

Intenté crear un alias de tabla. Eso parece funcionar, pero es bastante incómodo.

También intenté hacer algo como esto:

criteria.add(restriction.eq("TheAddressObjectFieldName", 123);

Funciona un tiempo, pero no siempre. No estoy seguro de que este sea el camino correcto, pero esperaba que pudiera hacerlo todo el tiempo.

Entonces, ¿cuál es la forma correcta de consultar en una columna de clave externa en hibernación?


Hibernate "envuelve muy bien" solo lo que le dices que envuelva. Entonces, suponiendo que su asignación de Employee ve algo así como:

@Entity public class Employee { ... @ManyToOne @JoinColumn(name="address_id") private Address address; ... }

y su Address tiene una propiedad de id , puede realizar consultas en función de la address_id través de:

session.createCriteria(Employee.class) .add(Restrictions.eq("address.id", addressId));

Para consultar en función de las propiedades de Address , deberá crear alias o criterios anidados :

session.createCriteria(Employee.class) .createAlias("address", "a") .add(Restrictions.eq("a.postalCode", postalCode));


Tener problemas similares ... @ La respuesta de ChssPly76 funciona bien, pero acaba de encontrar una solución si la clave externa no forma parte de Id en la tabla primaria; debe modificar la anotación agregando "referenciaColumnName":

@ManyToOne @JoinColumn(name="address_id", referencedColumnName="addrUniqueFieldName") private Address address;

y luego puedes crear criterios:

criteria.add(restriction.eq("address.addrUniqueFieldName", 123);