Search code examples
javahibernatejpacriteria

How to use AND in hibernate 5.2 Criteria?


I have two objects User and House. One user can have several houses.

Annotations from House.class:

@Entity
@Table(name="house")
public class House {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name="house_id")
private int id;

@ManyToOne
@JoinColumn(name="user_id")
private User user;

@Column(name="country")
private String country;

@Column(name="city")
private String city;

@Column(name="street")
private String street;

@Column(name="post_code")
private String postCode;

@Column(name="house_number")
private String houseNumber;

@Column(name="flats")
private int flats;

@Column(name="picture")
private String picture;

@Column(name="surname_first") // order names will be written in receipt
private Boolean writeSurnameFirst;

@Column(name="cut_name") // Nado ili net sokrashat imena
private Boolean cutName;

@ManyToOne
@JoinColumn(name="currency_id")
private Currency currency;

@ManyToOne
@JoinColumn(name="documentation_lang_id")
private Languages documentationLang;

@Column(name="default_house")
private Boolean defaultHouse;

I need to get a House object based on User and column defaultHouse = true.

I tried this code, but I can't get how to implement User into it:

tx = sess.beginTransaction();
// create criteria builder
CriteriaBuilder builder = sess.getCriteriaBuilder();
// create criteria
CriteriaQuery<House> query = builder.createQuery(House.class);
// specify criteria root
Root<House> root = query.from(House.class);
query.select(root).where(builder.equal(root.get("default_house"), true)
     .and(builder.equal(root.get(House.getUser), user)));
house = sess.createQuery(query).getSingleResult();
tx.commit();

Solution

  • In fact builder.and() takes two parameters which are the two restrictions to be joined with AND keyword in SQL, and the builder.and() should be used inside builder.where() method.

    change the following code:

    query.select(root).where(builder.equal(root.get("default_house"), true)
         .and(builder.equal(root.get(House.getUser), user)));
    

    Like this:

    query.select(root).where(builder.and(builder.equal(root.get("default_house"),  true), builder.equal(root.get(House.getUser), user))));
    

    Please refer to Hibernate ORM 5.2.11.Final User Guide for further details and more examples.

    Note:

    Hibernate is concerned about objects and not tables and when we use its modules like Criteria we use attributes names in the Object and not DB columns names.