java - openjpa 标准构建器和或

标签 java openjpa

嗨,我需要使用 and or 条件进行复杂的查询。但 and 条件似乎覆盖了 or 条件,这是我的代码:

public List<UtenteEntity> search(CartesioPojo params) {
    CriteriaBuilder cb = entityManager.getCriteriaBuilder();
    CriteriaQuery<UtenteEntity> q = cb.createQuery(UtenteEntity.class);
    Root<UtenteEntity> c = q.from(UtenteEntity.class);
    UtenteParams utente = (UtenteParams) params;
    List<Predicate> p = new Vector<Predicate>();
    if(utente.getUsername() != null && !utente.getUsername().equals(""))
        p.add(cb.equal(c.get("username"), cb.literal(utente.getUsername())));
    if(utente.getCognome() != null && !utente.getCognome().equals(""))
        p.add(cb.and(cb.equal(c.get("cognome"), cb.literal(utente.getCognome()))));
    if(utente.getRoles() != null && !utente.getRoles().isEmpty()) {
        for (RuoloEntity ruolo : utente.getRoles()) {
            p.add(cb.or(cb.equal(c.get("ruolo"), cb.literal(ruolo))));
        }
    }
    q.where(p.toArray(new Predicate[p.size()]));
    q.orderBy(cb.asc(c.get(USERNAME_COLUMN)));
    TypedQuery<UtenteEntity> query = entityManager.createQuery(q);
    List<UtenteEntity> result = query.getResultList();
    return result;
}

这是我执行此方法时的控制台输出:

executing prepstmnt 2471808 SELECT t0.SEQU_LONG_ID, t0.DATA_AGGIORNAMENTO, 
t0.DATA_CREAZIONE, t0.FK_UTENTE_AGGIORNAMENTO, t0.FK_UTENTE_CREAZIONE, t0.COGNOME, 
t0.FLAG_DISABILITATO, t0.NOME, t0.PASSWORD, t1.SEQU_LONG_ID, t1.DATA_AGGIORNAMENTO, 
t1.DATA_CREAZIONE, t1.FK_UTENTE_AGGIORNAMENTO, t1.FK_UTENTE_CREAZIONE, t1.CODICE, 
t1.DESCRIZIONE, t0.USERNAME FROM UTENTE t0, RUOLO t1 WHERE 
(t0.FK_RUOLO = ? AND t0.FK_RUOLO = ?) AND t0.FK_RUOLO = t1.SEQU_LONG_ID(+) 
ORDER BY t0.USERNAME ASC [params=?, ?]

最佳答案

对于谓词列表,您将在循环中添加包含单个元素的 or 子句:

 p.add(cb.or(cb.equal(c.get("ruolo"), cb.literal(ruolo))));

您想要创建一个用 or 连接的谓词列表,并将这个长 or 谓词添加到主列表中:

List<Predicate> disjunction = new ArrayList<Predicate>();
for (RuoloEntity ruolo : utente.getRoles()) {
    disjunction.add(cb.equal(c.get("ruolo"), cb.literal(ruolo)));
}
p.add(cb.or(disjunction.toArray(new Predicate[disjunction.size()])));

关于java - openjpa 标准构建器和或,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18012155/

相关文章:

java - 我是否应该经常调用 EntityManager.clear() 以避免内存泄漏?

java - TcpConnectionFactoryFactoryBean : using both SslContextSupport and SocketFactorySupport

java - 尝试将图像上传到服务器时出现 500 内部服务器

java - 在 openJPA mySQL 中删除实体时出现 OptimisticLockException

java - JPA 类格式错误 "Absent Code attribute in method that is not native or abstract in class file javax/persistence/Persistence"

java - WLS 10 客户端中抛出类未找到异常 (org.apache.openjpa.enhance.PersistenceCapable)

java - JList 类型不是通用的;它不能用参数 <String> 参数化

java - 如何通过jsp将用户重定向到新的html页面?

java - 合并排序值输出错误

java - 为什么Java Set包含一个要添加的对象,但没有Set元素等于该对象