web-dev-qa-db-fra.com

Mettre en veille prolongée un champ de clé étrangère avec ID

Par exemple, j'ai deux entités: Employé et Adresse. Parmi ces entités, Employee possède une clé étrangère AddressID référence la colonne ID sur Address. Dans les objets de domaine Java, Hibernate encapsule bien le champ entier de clé forgein avec un champ d'objet Adresse. Mais maintenant, comment pourrais-je interroger l'employé avec un certain AddressID?

J'ai essayé de créer un alias de table. Cela semble fonctionner, mais c'est assez gênant.

J'avais aussi essayé de faire quelque chose comme ça:

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

Cela fonctionne un certain temps mais pas toujours. Je ne suis pas sûr que ce soit la bonne façon, mais j'espérais que ce serait toujours possible.

Alors, quelle est la bonne façon d'interroger sur une colonne de clé étrangère en veille prolongée?

40
savanna

Hibernate "enveloppe bien" uniquement ce que vous lui dites d'envelopper. Donc, en supposant que votre mappage Employee ressemble à quelque chose comme:

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

et votre Address possède une propriété id, vous pouvez effectuer une requête en fonction de address_id via:

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

Pour effectuer une requête basée sur les propriétés Address, vous devrez créer des alias ou des critères imbriqués :

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

Ayant des problèmes similaires ... @ ChssPly76 la réponse fonctionne bien, mais vient de trouver une solution si la clé étrangère ne fait pas partie de l'ID dans la table parent - vous devez modifier l'annotation en ajoutant "referencedColumnName":

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

puis vous pouvez créer des critères:

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