休眠 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
}
Hibernate 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 */ }
Hibernate 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.your.package.name.customers.Company(c.id, c.name) " +
"FROM Company c " +
"WHERE c.enabled = 1 " +
"ORDER BY c.name ASC"
)
List<CompanyDTOIdNameInterface> compNameWhereEnabledTrue();
就这么简单。祝你好运:)