【问题标题】:How to use AND in hibernate 5.2 Criteria?如何在hibernate 5.2 Criteria中使用AND?
【发布时间】:2017-09-27 13:39:28
【问题描述】:

我有两个对象 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();

【问题讨论】:

    标签: java hibernate jpa criteria


    【解决方案1】:

    实际上builder.and()有两个参数,即SQL中要与AND关键字连接的两个限制,builder.and()应该在builder.where()方法中使用。

    更改以下代码:

    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,我们在对象中使用属性名称而不是数据库列名称。

    【讨论】:

      【解决方案2】:

      在 CriteriaBuilder 方法中,您必须使用如下实体字段名称:

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

      而不是数据库列名:

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

      【讨论】:

        【解决方案3】:

        我附上了我的例子:

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

        【讨论】:

          猜你喜欢
          • 2023-04-04
          • 2011-12-28
          • 1970-01-01
          • 1970-01-01
          • 2021-05-15
          • 2015-11-18
          • 1970-01-01
          • 2013-02-18
          • 1970-01-01
          相关资源
          最近更新 更多