Me gustaría seleccionar solo columnas específicas (por ejemplo, SELECT a FROM b
). Tengo un DAO genérico y lo que se me ocurrió es:JPA y API de criterios: seleccione solo columnas específicas
public List<T> getAll(boolean idAndVersionOnly) {
CriteriaBuilder builder = manager.getCriteriaBuilder();
CriteriaQuery<T> criteria = builder.createQuery(entityClazz);
Root<T> root = criteria.from(entityClazz);
if (idAndVersionOnly) {
criteria.select(root.get("ID").get("VERSION")); // HERE IS ERROR
} else {
criteria.select(root);
}
return manager.createQuery(criteria).getResultList();
}
Y el error es: The method select(Selection<? extends T>) in the type CriteriaQuery<T> is not applicable for the arguments (Path<Object>)
. ¿Cómo debería cambiar eso? Quiero obtener un objeto tipo T
que tiene solo ID
y VERSION
campos, y todos los demás son null
.
Tipo T
extiende AbstractEntity
que tiene esos 2 campos.
entityClazz
es T.class
.
Gracias. Quiero usarlo en mi servicio web. El cliente solicita una lista de "algo" que solo contiene ID y versiones. Luego lo compara con el caché y solicita objetos completos que hayan cambiado. ¿Suena razonable? – BartoszCichecki
¿Se trata de ahorrar ancho de banda de red? Depende de los datos, supongo, pero si espera que sus datos cambien a menudo, podría estar desperdiciando más ancho de banda debido a la sobrecarga de tcp/ip de crear dos solicitudes que a guardar simplemente enviando copias 'huecas'. Tal vez vale la pena echarle un vistazo? –
Sí, lo sé. Voy a usarlo solo para datos que no cambiarán tan a menudo. – BartoszCichecki