Подтвердить что ты не робот

JPA Query выбирает только определенные столбцы, не используя Query Query?

Можно ли выбрать, скажем, только свойства A и B из объекта с использованием запроса JPA без использования запросов критериев?

Чтобы выбрать все свойства, я бы просто сделал что-то вроде:

SELECT i FROM ObjectName i WHERE i.id = 10

Но у меня есть объект с многими свойствами в старой системе и хочу выбрать только несколько, хотя я знаю, что выбор нескольких свойств обычно выполняется быстро.

Возможно ли это без использования запросов критериев?

Спасибо!

4b9b3361

Ответ 1

Да, как и в обычном sql, вы можете указать, какие свойства вы хотите выбрать:

SELECT i.firstProperty, i.secondProperty FROM ObjectName i WHERE i.id=10

Выполнение этого запроса вернет список Object [], где каждый массив содержит выбранные свойства одного объекта.

Другой способ заключается в том, чтобы обернуть выбранные свойства в пользовательский объект и выполнить его в 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();

Примеры можно найти в этой статье.

Ответ 2

Вы можете использовать что-то вроде этого:

List<Object[]> list = em.createQuery("SELECT p.field1, p.field2 FROM Entity p").getResultList();

то вы можете перебрать его:

for (Object[] obj : list){
    System.out.println(obj[0]);
    System.out.println(obj[1]);
}

НО, если у вас есть только одно поле в запросе, вы получаете список типа не из Object []

Ответ 3

Отличный ответ! У меня есть небольшое дополнение. Что касается этого решения:

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);

Чтобы предотвратить ошибку, не найденную классом, просто вставьте полное имя пакета. Предполагая, что org.company.directory - это имя пакета 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();

Ответ 4

Projections можно использовать для выбора только определенных свойств (столбцов) объекта сущности.

Из документов

Spring Хранилища данных обычно возвращают модель домена при использовании методов запроса. Однако иногда вам может потребоваться изменить представление этой модели по разным причинам. В разделе this вы узнаете, как определять прогнозы для упрощения и сокращения просмотров ресурсов.

Определите интерфейс только с getters, который вы хотите.

interface CustomObject {  
    String getA(); // Actual property name is A
    String getB(); // Actual property name is B 
}

Теперь верните CustomObject из своего репозитория так:

public interface YOU_REPOSITORY_NAME extends JpaRepository<YOUR_ENTITY, Long> {
    CustomObject findByObjectName(String name);
}

Ответ 5

Я полагаю, вы могли бы взглянуть на эту ссылку, если я правильно понял ваш вопрос http://www.javacodegeeks.com/2012/07/ultimate-jpa-queries-and-tips-list-part_09.html

Например, они создали запрос типа:

 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'

Ответ 6

Да, это возможно. Все, что вам нужно сделать, это изменить ваш запрос на что-то вроде SELECT i.foo, i.bar FROM ObjectName i WHERE i.id = 10. Результатом запроса будет List массива Object. Первым элементом в каждом массиве является значение i.foo, а второй элемент - это значение i.bar. См. Соответствующий раздел ссылка JPQL.