java - query - jpa criteria where
¿JPA Query selecciona solo columnas específicas sin usar Criteria Query? (6)
Excelente respuesta! Tengo una pequeña adición. En cuanto a esta solución:
TypedQuery<CustomObject> typedQuery = em.createQuery(query , String query = "SELECT NEW CustomObject(i.firstProperty, i.secondProperty) FROM ObjectName i WHERE i.id=100";
TypedQuery<CustomObject> typedQuery = em.createQuery(query , CustomObject.class);
List<CustomObject> results = typedQuery.getResultList();CustomObject.class);
Para evitar un error de clase no encontrada, simplemente inserte el nombre completo del paquete. Suponiendo que org.company.directory es el nombre del paquete de CustomObject:
String query = "SELECT NEW org.company.directory.CustomObject(i.firstProperty, i.secondProperty) FROM ObjectName i WHERE i.id=10";
TypedQuery<CustomObject> typedQuery = em.createQuery(query , CustomObject.class);
List<CustomObject> results = typedQuery.getResultList();
¿Es posible seleccionar, por ejemplo, solo las propiedades A y B de un objeto usando una consulta JPA sin usar consultas de criterios?
Para seleccionar todas las propiedades, simplemente haré algo como:
SELECT i FROM ObjectName i WHERE i.id = 10
Pero tengo un objeto con muchas propiedades en un sistema heredado, y quiero seleccionar solo algunas, aunque sé que seleccionar varias propiedades suele ser rápido.
¿Es esto posible sin usar consultas de criterios?
¡Gracias!
Puedes usar algo como esto:
List<Object[]> list = em.createQuery("SELECT p.field1, p.field2 FROM Entity p").getResultList();
entonces puedes iterar sobre él:
for (Object[] obj : list){
System.out.println(obj[0]);
System.out.println(obj[1]);
}
PERO si solo tiene un campo en la consulta, obtendrá una lista del tipo que no proviene de Object []
Sí, al igual que en SQL simple, podría especificar qué tipo de propiedades desea seleccionar:
SELECT i.firstProperty, i.secondProperty FROM ObjectName i WHERE i.id=10
Ejecutar esta consulta devolverá una lista de Object [], donde cada matriz contiene las propiedades seleccionadas de un objeto.
Otra forma es ajustar las propiedades seleccionadas en un objeto personalizado y ejecutarlo en un TypedQuery:
String query = "SELECT NEW CustomObject(i.firstProperty, i.secondProperty) FROM ObjectName i WHERE i.id=10";
TypedQuery<CustomObject> typedQuery = em.createQuery(query , CustomObject.class);
List<CustomObject> results = typedQuery.getResultList();
Los ejemplos se pueden encontrar en this artículo.
ACTUALIZACIÓN 29.03.2018:
@Krish:
@PatrickLeitermann para mí está dando la excepción "Caused by: org.hibernate.hql.internal.ast.QuerySyntaxException: Unable to locate class ***". cómo resolver esto?
Supongo que estás usando JPA en el contexto de una aplicación de Spring, ¿no? Algunas otras personas tenían exactamente el mismo problema y su solución era agregar el nombre completo (ej. Com.example.CustomObject) después de SELECCIONAR NUEVAS palabras clave.
Tal vez la implementación interna del marco de datos de Spring solo reconoce las clases anotadas con @Entity o registradas en un archivo orm específico por su nombre simple, lo que causa el uso de esta solución.
Sí, es posible. Todo lo que tiene que hacer es cambiar su consulta a algo como SELECT i.foo, i.bar FROM ObjectName i WHERE i.id = 10
. El resultado de la consulta será una List
de matriz de Object
. El primer elemento en cada matriz es el valor de i.foo
y el segundo elemento es el valor i.bar
. Ver la sección relevante de referencia JPQL .
Supongo que podrías mirar este enlace si entendiera tu pregunta correctamente http://www.javacodegeeks.com/2012/07/ultimate-jpa-queries-and-tips-list-part_09.html
Por ejemplo, crearon una consulta como:
select id, name, age, a.id as ADDRESS_ID, houseNumber, streetName '' +
20'' from person p join address a on a.id = p.address_id where p.id = 1''
Projections
se pueden usar para seleccionar solo propiedades específicas (columnas) de un objeto de entidad.
De los documentos
Los repositorios de datos de Spring generalmente devuelven el modelo de dominio cuando usan métodos de consulta. Sin embargo, a veces, puede necesitar modificar la vista de ese modelo por varias razones. En Projections sección, aprenderá cómo definir proyecciones para ofrecer vistas simplificadas y reducidas de los recursos.
Defina una interfaz con solo los getters
que desee.
interface CustomObject {
String getA(); // Actual property name is A
String getB(); // Actual property name is B
}
Ahora devuelve CustomObject
de tu repositorio así:
public interface YOU_REPOSITORY_NAME extends JpaRepository<YOUR_ENTITY, Long> {
CustomObject findByObjectName(String name);
}