Ho una tabella denominata in MySQL con solo due colonne user_group_id
e group_id
(entrambi sono di tipo VARCHAR
). Entrambe queste colonne formano insieme una chiave primaria composita.clausola IN con una chiave primaria composita in criteri JPA
Ho bisogno di eseguire una dichiarazione utilizzando una sottoselezione IN()
per selezionare le righe in base a un elenco di valori passati alla query.
@Override
@SuppressWarnings("unchecked")
public List<GroupTable> getList(List<GroupTable> list)
{
CriteriaBuilder criteriaBuilder=entityManager.getCriteriaBuilder();
CriteriaQuery<GroupTable> criteriaQuery=criteriaBuilder.createQuery(GroupTable.class);
Root<GroupTable> root = criteriaQuery.from(entityManager.getMetamodel().entity(GroupTable.class));
criteriaQuery.where(root.in(list));
return entityManager.createQuery(criteriaQuery).getResultList();
}
L'implementazione produce la seguente query.
SELECT group_id,
user_group_id
FROM projectdb.group_table
WHERE ((?, ?) IN ((?, ?), (?, ?)))
/*Binding parameters.*/
bind => [null, null, ROLE_AAA, aaa, ROLE_BBB, aaa]
Si prega di notare che i primi due parametri che sono circa la chiave composita in sé sono null
. Dovrebbero essere rispettivamente user_group_id
e group_id
.
Perché non vengono sostituiti nell'elenco dei parametri?
Mentre io non sono interessati a formare una chiave primaria composta in una tabella, questo è (probabile) obbligatorio per JAAS sto utilizzando per l'autenticazione.
In questo scenario, la query restituisce lo stesso elenco fornito dal database che è inutile nella realtà. In realtà ho bisogno di questa query per l'eliminazione di più righe.
Non è possibile produrre una query come 'WHERE ((user_group_id, group_id) IN ((?,?), (?,?)))'? MySQL 5.x supporta questo. Sarebbe molto meglio, se possibile :) Grazie mille comunque. – Tiny
Hai testato la query in Hibernate ma l'errore si trova in Eclipselink. – zbig