如何在休眠 5.2 标准中使用 AND?
How to use AND in hibernate 5.2 Criteria?
我有两个对象 User
和 House
。一个用户可以拥有多个房子。
来自 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;
我需要根据 User
和列 defaultHouse = true
获得一个 House
对象。
我试过这段代码,但我不知道如何在其中实现 User
:
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();
其实builder.and()
有两个参数,就是SQL中要跟AND
关键字连接的两个限制,builder.and()
里面要用[=] 15=]方法。
更改以下代码:
query.select(root).where(builder.equal(root.get("default_house"), true)
.and(builder.equal(root.get(House.getUser), user)));
像这样:
query.select(root).where(builder.and(builder.equal(root.get("default_house"), true), builder.equal(root.get(House.getUser), user))));
请参阅 Hibernate ORM 5.2.11.Final User Guide 了解更多详细信息和更多示例。
注:
Hibernate
关注的是对象而不是表,当我们使用像 Criteria
这样的模块时,我们在对象中使用属性名称而不是数据库列名称。
在 CriteriaBuilder 方法中,您必须使用如下所示的实体字段名称:
builder.equal(root.get("defaultHouse"), true)
而不是数据库列名:
builder.equal(root.get("default_house"), true)
附上我的例子:
CriteriaBuilder builder = session.getCriteriaBuilder();
CriteriaQuery<Eje> query = builder.createQuery(Eje.class);
Root<Eje> productRoot = query.from(Eje.class);
query.select(productRoot)
.where(builder.and(builder.equal(productRoot.get("id"), 1), builder.equal(productRoot.get(Eje_.factorCriticos).get(FactorCritico_.id), 1)));
result =(List<T>) session.createQuery(query).getResultList();
我有两个对象 User
和 House
。一个用户可以拥有多个房子。
来自 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;
我需要根据 User
和列 defaultHouse = true
获得一个 House
对象。
我试过这段代码,但我不知道如何在其中实现 User
:
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();
其实builder.and()
有两个参数,就是SQL中要跟AND
关键字连接的两个限制,builder.and()
里面要用[=] 15=]方法。
更改以下代码:
query.select(root).where(builder.equal(root.get("default_house"), true)
.and(builder.equal(root.get(House.getUser), user)));
像这样:
query.select(root).where(builder.and(builder.equal(root.get("default_house"), true), builder.equal(root.get(House.getUser), user))));
请参阅 Hibernate ORM 5.2.11.Final User Guide 了解更多详细信息和更多示例。
注:
Hibernate
关注的是对象而不是表,当我们使用像 Criteria
这样的模块时,我们在对象中使用属性名称而不是数据库列名称。
在 CriteriaBuilder 方法中,您必须使用如下所示的实体字段名称:
builder.equal(root.get("defaultHouse"), true)
而不是数据库列名:
builder.equal(root.get("default_house"), true)
附上我的例子:
CriteriaBuilder builder = session.getCriteriaBuilder();
CriteriaQuery<Eje> query = builder.createQuery(Eje.class);
Root<Eje> productRoot = query.from(Eje.class);
query.select(productRoot)
.where(builder.and(builder.equal(productRoot.get("id"), 1), builder.equal(productRoot.get(Eje_.factorCriticos).get(FactorCritico_.id), 1)));
result =(List<T>) session.createQuery(query).getResultList();