Spring JPA выбирает определенные столбцы

Я использую Spring JPA для выполнения всех операций с базой данных. Однако я не знаю, как выбрать конкретные столбцы из таблицы в Spring JPA?

Например:
SELECT projectId, projectName FROM projects

Вы можете установить nativeQuery = true в annotations @Query из classа Repository следующим образом:

 public static final String FIND_PROJECTS = "SELECT projectId, projectName FROM projects"; @Query(value = FIND_PROJECTS, nativeQuery = true) public List findProjects(); 

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

 public List findAll() 

Вероятно, стоит посмотреть и на документальные данные Spring.

Мне особенно не нравится синтаксис (он выглядит немного взломанным …), но это самое элегантное решение, которое я смог найти (он использует пользовательский запрос JPQL в classе репозитория JPA):

 @Query("select new com.foo.bar.entity.Document(d.docId, d.filename) from Document d where d.filterCol = ?1") List findDocumentsForListing(String filterValue); 

Тогда, конечно, вам просто нужно предоставить конструктор для документа, который принимает имя docId & filename в качестве аргументов конструктора.

Вы можете использовать проекции из Spring Data JPA (doc) . В вашем случае создайте интерфейс:

 interface ProjectIdAndName{ String getId(); String getName(); } 

и добавьте следующий метод в ваш repository

 List findAll(); 

В моем случае я создал отдельный class сущности без полей, которые не требуются (только с полями, которые необходимы).

Сопоставьте объект с той же таблицей. Теперь, когда требуются все столбцы, я использую старый объект, когда требуются только некоторые столбцы, я использую объект Lite.

например

 @Entity @Table(name = "user") Class User{ @Column(name = "id", unique=true, nullable=false) int id; @Column(name = "name", nullable=false) String name; @Column(name = "address", nullable=false) Address address; } 

Вы можете создать что-то вроде:

 @Entity @Table(name = "user") Class UserLite{ @Column(name = "id", unique=true, nullable=false) int id; @Column(name = "name", nullable=false) String name; } 

Это работает, когда вы знаете столбцы для извлечения (и это не изменится).

не будет работать, если вам нужно динамически решать столбцы.

В моей ситуации мне нужен только результат json, и это работает для меня:

 public interface SchoolRepository extends JpaRepository { @Query("select s.id, s.name from School s") List getSchoolIdAndName(); } 

в controllerе:

 @Autowired private SchoolRepository schoolRepository; @ResponseBody @RequestMapping("getschoolidandname.do") public List getSchool() { List schools = schoolRepository.getSchoolIdAndName(); return schools; } 

Я думаю, что простым способом может быть использование QueryDSL , который поставляется с Spring-Data.

Используя ваш вопрос, можно ответить

 JPAQuery query = new JPAQuery(entityManager); List result = query.from(projects).list(project.projectId, project.projectName); for (Tuple row : result) { System.out.println("project ID " + row.get(project.projectId)); System.out.println("project Name " + row.get(project.projectName)); }} 

Диспетчер объектов может быть Autowired, и вы всегда будете работать с объектами и кланами без использования * языка QL.

Как вы можете видеть в ссылке, последний выбор кажется почти для меня более элегантным, то есть с использованием DTO для сохранения результата. Примените к вашему примеру, который будет:

 JPAQuery query = new JPAQuery(entityManager); QProject project = QProject.project; List dtos = query.from(project).list(new QProjectDTO(project.projectId, project.projectName)); 

Определение ProjectDTO как:

 class ProjectDTO { private long id; private String name; @QueryProjection public ProjectDTO(long projectId, String projectName){ this.id = projectId; this.name = projectName; } public String getProjectId(){ ... } public String getProjectName(){....} } 
 Using Spring Data JPA there is a provision to select specific columns from database ---- In DAOImpl ---- @Override @Transactional public List getAllEmployee() throws Exception { LOGGER.info("Inside getAllEmployee"); List empList = empRepo.getNameAndCityOnly(); return empList; } ---- In Repo ---- public interface EmployeeRepository extends CrudRepository { @Query("select e.name, e.city from Employee e" ) List getNameAndCityOnly(); } It worked 100% in my case. Thanks. 

В исходном sql можно указать значение null как значение поля.

 @Query(value = "select p.id, p.uid, p.title, null as documentation, p.ptype " + " from projects p " + "where p.uid = (:uid)" + " and p.ptype = 'P'", nativeQuery = true) Project findInfoByUid(@Param("uid") String uid); 

Вы можете применить приведенный ниже код в своем classе интерфейса репозитория.

entityname означает имя вашей базы данных, например, проекты. И List означает, что Project – это class Entity в ваших проектах.

 @Query(value="select p from #{#entityName} p where p.id=:projectId and p.projectName=:projectName") List findAll(@Param("projectId") int projectId, @Param("projectName") String projectName); 

Вы можете использовать JPQL:

 TypedQuery  query = em.createQuery( "SELECT p.projectId, p.projectName FROM projects AS p", Object[].class); List results = query.getResultList(); 

или вы можете использовать собственный SQL-запрос.

 Query query = em.createNativeQuery("sql statement"); List results = query.getResultList(); 

Использование собственного запроса:

 Query query = entityManager.createNativeQuery("SELECT projectId, projectName FROM projects"); List result = query.getResultList(); 

Большинство ответов здесь предлагают использовать некоторые варианты собственного SQL-запроса. Однако, используя встроенные данные весны jpa, мы можем это сделать:

Вам просто нужно использовать следующую подпись метода в classе репозитория.

 ModelClass findBy$Column_1And$Column_2In(Object $col1Value, Object $col2Value ); 

В зависимости от схемы он может вернуть список или один экземпляр. Этот подход может применяться к одиночным или нескольким столбцам, как показано выше.

Для вашего примера это может быть что-то вроде:

 Project findByProjectIdAndProjectNameIn(long projectId, String projectName); 

projectId, projectName

  • Как сохранить типы JSR-310 с помощью Spring Data JPA?
  • Spring Boot & JPA: реализация поисковых запросов с дополнительными критериями дальности
  • ImprovedNamingStrategy больше не работает в Hibernate 5
  • Как работает FetchMode в Spring Data JPA
  • Spring Data JPA: пакетная вставка для вложенных объектов
  • Spring-Data FETCH JOIN with Paging не работает
  • Данные Spring jpa- Определен бит bean с именем 'entityManagerFactory'; Инъекция автоуведомленных зависимостей не удалась
  • В чем разница между интерфейсами CrudRepository и JpaRepository в Spring Data JPA?
  • Объединение двух элементов таблицы в Spring Data JPA
  • Как проверить поддержку декларативного кэширования Spring в хранилищах Spring Data?
  • setMaxResults для annotations Spring-Data-JPA?
  • Interesting Posts

    Получение ошибки «Активность Java.lang.IllegalStateException была уничтожена» при использовании вкладок с ViewPager

    Как назвать исходные файлы C # для общих classов

    Высокая латентность / пинг для локальных шлюзов WHILE STREAMING

    Как сохранить массив int в настройках приложения

    Установка свойства ‘source’ в ‘org.eclipse.jst.jee.server: JSFTut’ не нашел подходящего свойства

    Как получить текущий buildType в конфигурации Android Gradle

    Почему microsoft сделал JavaScriptSerializer устаревшим до .net 3.5 SP1 и снова активным после этого?

    leiningen – как добавить зависимости для локальных банок?

    HtmlUnit Only Отображает HTML-страницу хоста для приложения GWT

    Понимание блока и типа блока Magento

    Как использовать Push-уведомления в форматах Xamarin

    Трассировка стека или дополнительная информация о необработанном исключении в Xcode / iPhone

    Как объединить сложные полигоны?

    Я попытался установить Ubuntu 10.04, и я получил это сообщение – любые идеи о том, что делать?

    Как конвертировать двойной в длинный без кастинга?

    Давайте будем гением компьютера.