【问题标题】:How to Create Criteria Query in Hibernate?如何在 Hibernate 中创建条件查询?
【发布时间】:2016-08-29 11:50:47
【问题描述】:

我是 Hibernate 的新手,我想在 Hibernate 中学习 CriteriaQuery 时将 JPQL 转换为 Criteria Query。我成功地创建了 JPQL,但在标准中被停止了。以下是我的场景:

物品类别:

    @Entity
    @Table(name = "ITEM")
     public class Item   {

         @Id 
        @GeneratedValue(strategy=GenerationType.AUTO)
        @Column(name = "ITEM_ID")
        private Long id = null;

        @Version
        @Column(name = "OBJ_VERSION")
        private int version = 0;

        @Column(name = "ITEM_NAME", length = 255, nullable = false, updatable = false)
        private String name;

        @ManyToOne(fetch=FetchType.EAGER,  cascade = CascadeType.ALL) 
        @JoinColumn(name="itemSellerId") 
         private User seller;

        @Transient
        private User buyer;
........

用户类::

...
 @OneToMany(fetch=FetchType.EAGER, cascade = {CascadeType.PERSIST,CascadeType.MERGE})
        private Set<Item> boughtItems = new HashSet<Item>();
..

我的 JPQL 查询运行良好::

public List<Item> findBySellerOrBuyer(Long sellerId,Long buyerId) {
        Query query = entityManager.createQuery("select distinct i from Item i, User u  "
                + "where (i.initialPrice >  22 and i.seller.id = :sellerId) "
                +                   "OR "
                + "( u.id = :buyerId and i member of u.boughtItems and  i.initialPrice = i.reservePrice  )");
        return (List<Item>) query.setParameter("sellerId", sellerId).setParameter("buyerId", buyerId).getResultList();

    }

条件是:: 获取匹配项的条件查询: a) 卖方和初始价格 > 22.0 要么 b) 买方和保留价格 = 初始价格

谢谢:)

上次更新

CriteriaBuilder builder = entityManager.getCriteriaBuilder();
        CriteriaQuery<Item> cr = builder.createQuery(Item.class);

        Criterion price = Restrictions.gt("initial price", 22);
        Criterion name = Restrictions.eq("seller.id","abc");

        Criterion Buyer = Restrictions.eq("buyer.id","abc");
        Criterion reserved_price = Restrictions.eq("reserved_price","initial_price");

        // To get records matching with AND condition for price  & name 
        LogicalExpression andExp = Restrictions.and(name, price);
        LogicalExpression andExp2 = Restrictions.and(Buyer, reserved_price);




        return (List<Item>) ((Criteria) cr).list();

【问题讨论】:

    标签: java spring hibernate jpql


    【解决方案1】:

    使用下面的代码 -

    Criteria cr = session.createCriteria(Item.class);
    
    Criterion price = Restrictions.gt("initial price", 22);
    Criterion name = Restrictions.eq("seller.id","abc");
    
    Criterion Buyer = Restrictions.eq("buyer.id","abc");
    Criterion reserved_price = Restrictions.eq("reserved_price","initial_price");
    
     Disjunction objDisjunction = Restrictions.disjunction();
                /* Add multiple condition separated by OR clause within brackets. */
    objDisjunction.add(Restrictions.and(price , name ));
    objDisjunction.add(Restrictions.and(Buyer, reserved_price));
    cr.add(objDisjunction);
    List results = cr.list();
    

    【讨论】:

    • 嗨@Narendra 我已经完成了你提供的答案,我唯一没有得到的是如何在 Or 条件下使用那些 ExpressionQuery,例如:andExp1 OR andExp2。我已经用我迄今为止创建的查询更新了这个问题。谢谢
    猜你喜欢
    • 2015-01-08
    • 1970-01-01
    • 2012-05-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-07
    • 1970-01-01
    • 1970-01-01
    • 2021-08-27
    相关资源
    最近更新 更多