JPA CriteriaBuilder如何创建join + like查询

时间:2017-01-14 06:38:12

标签: java mysql jpa orm criteria

我有一个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));

请帮助,如何做得更好?

1 个答案:

答案 0 :(得分:0)

  1. 选择不明确。在SQL中,您选择s.*, p.name, p.code,但在标准中,您期望Long

  2. 您的LEFT JOIN不得LEFT

  3. 标准中您根本没有加入。

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

  5. 我认为您希望所有Stock包含至少一个名为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();