【问题标题】:JPA CriteriaBuilder how to create join + like queryJPA CriteriaBuilder如何创建join + like查询
【发布时间】:2017-01-14 06:38:11
【问题描述】:

我有一个 SQL 查询:

   SELECT s.*, p.name, p.code 
     FROM `stock` s 
LEFT JOIN product p ON s.product_id = p.id 
    WHERE p.name LIKE "%q%"

我需要使用criteriabuilder创建查询

我是这样开始的:

CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Long> cq = cb.createQuery(Long.class);
Root<Stock> stock = cq.from(Stock.class);

Path<String> path = stock.get(filter.getKey());//i have error here
String likeValue = wildCard + value + wildCard;
Predicate filterCondition = cb.conjunction();
filterCondition = cb.and(filterCondition, cb.like(path, likeValue));

请帮忙,怎样才能做得更好?

【问题讨论】:

    标签: java mysql jpa orm criteria


    【解决方案1】:
    1. 选择不明确。在 SQL 中您选择 s.*, p.name, p.code,但在条件中您期望 Long

    2. 您的LEFT JOIN 不能是LEFT

    3. 在条件中您根本没有加入。

    4. 作为一般建议,您应该使用元模型。

    我想你想要所有Stocks,其中至少包含一个Product,名称类似于%value%

    如果我的假设是正确的:

    CriteriaBuilder cb = em.getCriteriaBuilder();
    
    CriteriaQuery<Stock> cq = cb.createQuery(Stock.class);
    
    Root<Stock> stock = cq.from(Stock.class);
    Join<Stock, Product> product = stock.join(Stock_.products);
    
    cq.select(stock);
    cq.distinct(true);
    cq.where(cb.like(product.get(Product_.name), "%" + value + "%");
    
    return em.createQuery(cq).getResultList();
    

    【讨论】:

      猜你喜欢
      • 2012-01-30
      • 1970-01-01
      • 2020-02-26
      • 2012-04-29
      • 1970-01-01
      • 2014-03-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多