Выберите только несколько столбцов из таблицы - PullRequest
0 голосов
/ 15 ноября 2018

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

Мои таблицы огромные, и мне не разрешено отображать все столбцы в моих сущностях.Я попытался создать сущность (как примечание, у меня нет таблиц PK в моих таблицах):

@Entity
@Table(name = "SuperCat")
@Getter
@Setter
public class Cat{

@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE)
private Long id;

@Column(name="nameCat")
private String name;
}

, а затем в моем хранилище до

public interface CatRepository extends 
CrudRepository<Cat, Long> {

@Query(
  "SELECT name FROM Cat")
Page<Cat> getAlCats(Pageable pageable);

Это толькопростой пример, но идея та же.Я много искал и нашел прогнозы, но там нужно отобразить всю таблицу, затем я нашел нативные запросы, но они все еще не применяются.Я знаю, что могу вернуть объект, и другое решение - использовать запрос с NEW и создать свой собственный объект (без @entity, как pojo).Но есть ли способ, которым я могу сделать это, используя jpa, чтобы иметь возможность использовать репозиторий и сервисы, если я создаю свое собственное pojo, тогда я создам класс @transactional, помещая запросы (с NEW) туда, и это все.Мне не нравится этот подход, и я не думаю, что jpa не позволяет вам выбирать только некоторые столбцы, но я не нашел правильный путь.Может быть, вы спросите, каков результат, если я делаю так: я получаю эту ошибку: «Невозможно создать TypedQuery для запроса с более чем одним возвратом, используя запрошенный тип результата [java.lang.Long]» (Для новых запросов яговорим о: http://www.java2s.com/Tutorials/Java/JPA/4800__JPA_Query_new_Object.htm возможно мне было непонятно)

Ответы [ 2 ]

0 голосов
/ 19 ноября 2018

Проекция Spring-data-jpa Не нужно отображать всю таблицу, просто выберите необходимые поля:

// define the dto interface
public interface CatDto {
  String getName();
  // other necessary fields
  ...
}

@Query(value = "select c.name as name, ... from Cat as c ...)
Page<CatDto> getAllCats(Pageable pageable);

Таким образом, CatDto является интерфейсом, и он включает только часть файлов всей таблицы. Имя его поля должно соответствовать псевдониму выбранного поля.

0 голосов
/ 15 ноября 2018

Вы можете сделать то же самое, используя следующий подход.

Просто создайте конструктор в классе сущности со всеми обязательными параметрами, а затем в запросе jpa используйте оператор new в запросе, как показано ниже.

String query = "SELECT NEW com.dt.es.CustomObject(p.uniquePID)  FROM PatientRegistration AS p";
        TypedQuery<CustomObject> typedQuery = entityManager().createQuery(query , CustomObject.class);
        List<CustomObject> results = typedQuery.getResultList();
        return results;

И класс CustomObject должен выглядеть как конструктор ниже.

public class CustomObject {

    private String uniquePID;

    public CustomObject(String uniquePID) {
        super();
        this.uniquePID = uniquePID;
    }

    public String getUniquePID() {
        return uniquePID;
    }

    public void setUniquePID(String uniquePID) {
        this.uniquePID = uniquePID;
    }


}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...