For example, I have two entities: Employee and Address. Of these enitities, Employee has a foreign key AddressID references the ID column on Address. In the Java domain objects, Hibernate nicely wraps the forgein key integer field with a Address object field. But now, how could I query the Employee with a certain AddressID?
I have tried to create a table alias. That seems to work, but it is fairly awkward.
I had also tried to do something like this:
criteria.add(restriction.eq("TheAddressObjectFieldName", 123);
It works some time but not always. I am not sure this is the right way, but I was hoping it could all the time.
So what is the right way to query on a foreign key column in hibernate?
Hibernate "nicely wraps" only what you tell it to wrap. So, assuming that your Employee
mapping looks something like:
@Entity
public class Employee {
...
@ManyToOne
@JoinColumn(name="address_id")
private Address address;
...
}
and your Address
has an id
property, you can query based on address_id
via:
session.createCriteria(Employee.class)
.add(Restrictions.eq("address.id", addressId));
In order to query based on Address
properties, you'll have to create aliases or nested criteria:
session.createCriteria(Employee.class)
.createAlias("address", "a")
.add(Restrictions.eq("a.postalCode", postalCode));
Having similar trouble... @ChssPly76 answer works fine, but just found solution if foreign key is not part of Id in parent table - you must modify annotation by adding "referencedColumnName":
@ManyToOne
@JoinColumn(name="address_id", referencedColumnName="addrUniqueFieldName")
private Address address;
and then you can create criteria:
criteria.add(restriction.eq("address.addrUniqueFieldName", 123);
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With