¿JPA Query selecciona solo columnas específicas sin usar Criteria Query?

¿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!

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 typedQuery = em.createQuery(query , CustomObject.class); List results = typedQuery.getResultList(); 

Los ejemplos se pueden encontrar en este 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 dataframe 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.

Puedes usar algo como esto:

 List 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 []

Excelente respuesta! Tengo una pequeña adición. En cuanto a esta solución:

 TypedQuery typedQuery = em.createQuery(query , String query = "SELECT NEW CustomObject(i.firstProperty, i.secondProperty) FROM ObjectName i WHERE i.id=100"; TypedQuery typedQuery = em.createQuery(query , CustomObject.class); List 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 typedQuery = em.createQuery(query , CustomObject.class); List results = typedQuery.getResultList(); 

Projections se pueden usar para seleccionar solo propiedades específicas (columnas) de un objeto de entidad.

De los documentos

Los repositorys 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 esta 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 repository así:

 public interface YOU_REPOSITORY_NAME extends JpaRepository { CustomObject findByObjectName(String name); } 

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' 

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 .

    Intereting Posts