我有一个 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));
请帮忙,如何做得更好?
最佳答案
选择不明确。在 SQL 中,您选择
s.*, p.name, p.code
,但在条件中您期望Long
?您的
LEFT JOIN
不必是LEFT
。在您根本没有加入的标准中。
作为一般建议,您应该使用元模型。
我认为您想要所有 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();
关于java - JPA CriteriaBuilder 如何创建 join + like 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41647477/