簡體   English   中英

從帶有參數的JPQL查詢中選擇全部

[英]select all from a JPQL query, with paremeters

我在平面數據上有選擇參數,只知道如何完全省略參數,或者使其成為完整的通配符。 搜索可能使用一個或所有參數。 這是怎么做到的? 隨着ANYALL 或者,還有另一種方式嗎?

我想對所有參數使用一個通用查詢,並傳遞“全部”或“任何”,這些行中的某些參數。

現有代碼:

package legacy.database;

import java.sql.Timestamp;
import java.util.List;
import java.util.logging.Logger;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.persistence.Query;

public class MyQueries {

    private static final Logger log = Logger.getLogger(MyQueries.class.getName());
    private final EntityManagerFactory emf = Persistence.createEntityManagerFactory("LegacyDatabasePU");
    private final EntityManager em = emf.createEntityManager();

    public MyQueries() {
    }

    public List<Clients> findAll() {
        Query q = em.createQuery("select c from Clients c");
       List<Clients> clients = q.getResultList();
        return clients;
    }

    public List<Clients> selectWithParameters(Criteria c) {
        log.info(c.toString());
        String opener = c.getOpener();
        String closer1 = c.getCloser1();
        String status = c.getStatus();
        Query q = em.createQuery(
                "SELECT c FROM Clients c "
                + "WHERE c.status like :status "
                + "and c.closer1 like :closer1 "
                + "and c.opener like :opener");
        q.setParameter("opener", opener);
        q.setParameter("closer1", closer1);
        q.setParameter("status", status);
        log.info(q.toString());
        List<Clients> clients = q.getResultList();
        log.fine(clients.toString());
        return clients;
    }

    public Clients findById(int id) {
        Clients client = em.find(Clients.class, id);
        return client;
    }

    public void send(int id) {
        Clients c = em.find(Clients.class, id);
        java.util.Date date = new java.util.Date();
        Timestamp t = new Timestamp(date.getTime());
        em.getTransaction().begin();
        c.setDateUpdated(t.toString());
        em.getTransaction().commit();
    }
}

如果參數是可選的,則標准API提供了一些更大的靈活性。 如果經常調用selectWithParameters ,請考慮使用參數,因為DB可以緩存參數化查詢。

帶有可選參數的selectWithParameters讀取如下:

public List<Clients> selectWithParameters(Criteria criteria) {
    log.info(criteria.toString());
    String opener = criteria.getOpener();
    String closer1 = criteria.getCloser1();
    String status = criteria.getStatus();

    CriteriaBuilder criteriaBuilder = em.getCriteriaBuilder();
    CriteriaQuery<Clients> query = criteriaBuilder.createQuery(Clients.class);
    Root<Clients> c = query.from(Clients.class);
    List<Predicate> wherePredicates = new LinkedList<Predicate>();
    if (null != status) {
        wherePredicates.add(criteriaBuilder.like(c.get("status"), status));
    }
    if (null != closer1) {
        wherePredicates.add(criteriaBuilder.like(c.get("closer1"), closer1));
    }
    if (null != opener) {
        wherePredicates.add(criteriaBuilder.like(c.get("opener"), opener));
    }
    query.where(wherePredicates.toArray(new Predicate[0]));

    List<Clients> clients = em.createQuery(query).getResultList();
    log.fine(clients.toString());
    return clients;
}

海納,謝謝你。 這工作,不知道為什么我遇到海納的代碼有問題,但他的樣本讓我朝着正確的方向:

public List<Clients> selectByCriteria(Criteria criteria) {
    CriteriaBuilder criteriaBuilder = em.getCriteriaBuilder();
    CriteriaQuery<Clients> clientCriteriaQuery = criteriaBuilder.createQuery(Clients.class);
    Root<Clients> clientRoot = clientCriteriaQuery.from(Clients.class);
    clientCriteriaQuery.select(clientRoot);
    List<Predicate> predicates = new ArrayList<>();
    predicates.add(criteriaBuilder.like(clientRoot.get(Clients_.phone1), "%" + criteria.getPhone1() + "%"));
    if (!criteria.getOpener().equalsIgnoreCase("all")) {
        predicates.add(criteriaBuilder.like(clientRoot.get(Clients_.opener), "%" + criteria.getOpener() + "%"));
    }
    if (!criteria.getCloser1().equalsIgnoreCase("all")) {
        predicates.add(criteriaBuilder.like(clientRoot.get(Clients_.closer1), "%" + criteria.getCloser1() + "%"));
    }
    if (!criteria.getStatus().equalsIgnoreCase("all")) {
        predicates.add(criteriaBuilder.like(clientRoot.get(Clients_.status), "%" + criteria.getStatus() + "%"));
    }
    clientCriteriaQuery.where(predicates.toArray(new Predicate[0]));
    List<Clients> clients = em.createQuery(clientCriteriaQuery).getResultList();
    return clients;
}

海納的回答可能沒有實質性的差異(?)。 JPA和JPQL有點模糊。 我簡直不敢相信,但我幾乎更喜歡SQL! 我得調整一下。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM