2017-09-27 8 views
1

J'ai deux objets User et House. Un utilisateur peut avoir plusieurs maisons.Comment utiliser AND en Hibernate 5.2 Critères?

Annotations de 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; 

je dois obtenir un objet House basé sur User et la colonne defaultHouse = true.

J'ai essayé ce code, mais je ne peux pas comment mettre en œuvre User en elle:

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(); 

Répondre

1

En fait builder.and() prend deux paramètres qui sont les deux restrictions à joindre avec mot-clé AND dans SQL, et le builder.and() doit être utilisé dans la méthode builder.where().

changer le code suivant:

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

Comme ceci:

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

S'il vous plaît se référer à Hibernate ORM 5.2.11.Final User Guide pour plus de détails et d'autres exemples.

Note:

Hibernate est préoccupé par des objets et non des tables et lorsque nous utilisons ses modules comme Criteria nous utilisons les noms d'attributs dans le nom objet et non pas les colonnes DB.

0

Dans les méthodes de CriteriaBuilder vous devez utiliser les noms de champs d'entité comme suit:

builder.equal(root.get("defaultHouse"), true) 

et non les noms de colonnes de base de données:

builder.equal(root.get("default_house"), true)