对的,这是可能的。您可以为其使用自定义变压器:Fluent nHibernate 结果转换器 https://github.com/v-ladynev/fluent-hibernate#nested-transformer.
您可以复制粘贴代码,或通过 Maven 添加 jar:流畅的休眠核心 http://mvnrepository.com/artifact/com.github.v-ladynev/fluent-hibernate-core.
你需要使用Criteria
with Projections
。请不要忘记指定投影别名(userName
, addressDetails.countryCode
)
Criteria criteria = session.createCriteria(Customer.class);
criteria.createAlias("addressDetails", "addressDetails", JoinType.LEFT_OUTER_JOIN);
criteria.setProjection(Projections.projectionList()
.add(Projections.property("userName").as("userName"))
.add(Projections.property("addressDetails.countryCode")
.as("addressDetails.countryCode")));
List<Customer> customers = criteria.setResultTransformer(
new FluentHibernateResultTransformer(Customer.class)).list();
与 HQL 一起使用
它不可能与 HQL 一起使用,因为 Hibernate 不允许在 HQL 中嵌套别名
select addressDetails.countryCode as addressDetails.countryCode
这将是一个错误addressDetails.countryCode
alias.
与本机 SQL 一起使用
该转换器可用于具有嵌套投影的本机 SQL(与 HQL 相反)。
在这种情况下,需要使用带引号的别名:
String sql = "select c.f_user_name as userName, d.f_country_code as \"addressDetails.countryCode\" "
+ "from customers c left outer join address_details d on c.fk_details = d.f_pid";
List<Customer> customers = session.createSQLQuery(sql)
.setResultTransformer(new FluentHibernateResultTransformer(Customer.class))
.list();