2017-01-14 4 views
1

J'ai une requête SQL:JPA CriteriaBuilder comment créer se joindre + comme requête

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

Et je dois créer la requête en utilisant criteriabuilder

J'ai commencé alors:

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

S'il vous plaît aide, comment le faire mieux?

Répondre

0
  1. la sélection n'est pas claire. Dans SQL, vous sélectionnez s.*, p.name, p.code, mais dans les critères vous attendez un Long?

  2. votre LEFT JOIN ne doit pas être LEFT.

  3. dans les critères que vous n'avez aucune jointure du tout.

  4. vous devriez utiliser le métamodèle, comme un conseil général.

Je pense que vous voulez tous Stock s qui contiennent au moins un Product avec le nom comme %value%.

Si mon hypothèse est juste:

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