休眠 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();
就这么简单。祝你好运 :)