Hibernar consulta un campo de clave externa con ID


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

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

También había intentado hacer algo como esto:

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

Funciona algún 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 una columna de clave foránea en hibernación?

Author: o.k.w, 2009-11-24

2 answers

Hibernar "bien envuelve" solo lo que le dices que envuelva. Por lo tanto, suponiendo que su Employee mapeo se ve algo así como:

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

Y su Address tiene una propiedad id, puede realizar consultas basadas en address_id a través de:

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

Para realizar una consulta basada en las propiedades Address, tendrá que crear alias o criterios anidados :

session.createCriteria(Employee.class)
 .createAlias("address", "a")
 .add(Restrictions.eq("a.postalCode", postalCode));
 68
Author: ChssPly76,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-11-24 01:04:36

Tener problemas similares... @ChssPly76 respuesta funciona bien, pero acaba de encontrar la solución si la clave externa no es parte de Id en la tabla padre - debe modificar la anotación añadiendo "referencedColumnName":

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

Y luego puedes crear criterios:

criteria.add(restriction.eq("address.addrUniqueFieldName", 123);
 2
Author: Helija,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-07-22 17:17:02