Спящий режим 5, Весна 5
У вас есть несколько вариантов, но самый простой вариант — создать простой @Query с нужными вам столбцами/полями, см. пример кода из одного из моих проектов.
Прежде всего, вам не нужно создавать DTO с подмножеством полей, я покажу варианты как для гибридной версии.
Вариант первый: объект DTO с подмножеством столбцов/полей.
Код репозитория DTO:
@Query( "SELECT new com.your.package.name.customers.CompanyDTOIdName(c.id, c.name) " +
"FROM Company c " +
"WHERE c.enabled = 1 " +
"ORDER BY c.name ASC" )
List<CompanyDTOIdName> compDtoNameWhereEnabledTrue();
Объект подмножества DTO:
public class CompanyDTOIdName {
private long id;
private String name;
public CompanyDTOIdName(long id, String name) {
this.id = id;
this.name = name;
}
// accessors/mutators methods
}
Спящий код выполнения SQL:
SELECT
new com.your.package.name.customers.CompanyDTOIdName(c.id, c.name)
FROM
Company c
WHERE
c.enabled = 1
ORDER BY
c.name ASC
select
company0_.companyId as col_0_0_,
company0_.name as col_1_0_
from
ome_company company0_
where
company0_.enabled=1
order by
company0_.name ASC
Основным недостатком является то, что вам потребуется отдельный объект DTO для каждой комбинации столбцов.
Вариант второй: использование оригинального @Entity
Ваш второй вариант, намного проще и будет работать с любым подмножеством столбцов, выглядит следующим образом:
Код репозитория:
@Query( "SELECT new com.your.package.name.customers.Company(c.id, c.name) " +
"FROM Company c " +
"WHERE c.enabled = 1 " +
"ORDER BY c.name ASC"
)
List<Company> compNameWhereEnabledTrue();
Где Company — ваш исходный объект @Entity.
Ваш объект Entity должен содержать пустые конструкторы, а также конструкторы, соответствующие вашему оператору @Query в этом случае:
public void Company() {}
public void Company(Long id, String name) { /* code omitted */ }
Спящий код выполнения SQL:
SELECT
new com.your.package.name.customers.Company(c.id, c.name)
FROM
Company c
WHERE
c.enabled = 1
ORDER BY
c.name ASC
select
company0_.companyId as col_0_0_,
company0_.name as col_1_0_
from
ome_company company0_
where
company0_.enabled=1
order by
company0_.name ASC
Предостережение: я уверен, что вы видите проблему с этим подходом. Загружаются только указанные столбцы/поля. Вы получите исключения, если попытаетесь получить доступ к неинициированным полям.
Гибридная версия с использованием интерфейсов (лучшее из обоих миров)
Создайте интерфейс с обязательными полями доступа.
public interface CompanyDTOIdNameInterface {
public Long getId();
public String getName();
}
Реализовать интерфейс для объекта @Entity.
public class Company implements Serializable,
CompanyDTOIdNameInterface
{ /* omitted code */ }
Код репозитория:
@Query( "SELECT new com.csfactorynw2.site.customers.Company(c.id, c.name) " +
"FROM Company c " +
"WHERE c.enabled = 1 " +
"ORDER BY c.name ASC"
)
List<CompanyDTOIdNameInterface> compNameWhereEnabledTrue();
Это так просто. Удачи :)
person
Vlad Palnik
schedule
17.04.2019