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

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

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

SELECT i FROM ObjectName i WHERE i.id = 10 

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

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

Спасибо!

Да, как и в обычном 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 typedQuery = em.createQuery(query , CustomObject.class); List results = typedQuery.getResultList(); 

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

ОБНОВЛЕНИЕ 29.03.2018:

@Krish:

@PatrickLeitermann для меня его предоставление «вызвано: org.hibernate.hql.internal.ast.QuerySyntaxException: исключить исключение classа ***». как это решить?

Думаю, вы используете JPA в контексте приложения Spring, не так ли? Некоторые другие люди имели точно такую ​​же проблему, и их решение заключалось в добавлении полного имени (например, com.example.CustomObject) после ключевых слов SELECT NEW .

Возможно, внутренняя реализация Spring data framework распознает только classы, аннотированные с @Entity или зарегистрированные в определенном файле orm по их простому имени, что приводит к использованию этого обходного пути.

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

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

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

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

Чтобы предотвратить ошибку, не найденную 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 typedQuery = em.createQuery(query , CustomObject.class); List results = typedQuery.getResultList(); 

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

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

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

Определите интерфейс только с 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 { CustomObject findByObjectName(String name); } 

Полагаю, вы могли бы взглянуть на эту ссылку, если я правильно понял ваш вопрос. 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' 

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

  • Выражение конструктора JPQL - org.hibernate.hql.ast.QuerySyntaxException: таблица не отображается
  • Сохранение карты с использованием JPA
  • В JPA 2, используя CriteriaQuery, как подсчитать результаты
  • JPA 2.0 orphanRemoval = true VS on delete Cascade
  • Hibernate - @ElementCollection - странное поведение удаления / вставки
  • JPA 2.0 аннотация @OrderColumn в Hibernate 3.5
  • Нарушение спящего режима с помощью orphanRemoval
  • JPA CriteriaBuilder - Как использовать оператор сравнения «IN»
  • Давайте будем гением компьютера.