我的目标是创建我的 Contact
对象直接来自查询和hibernate,其特点主要有三个:
contact对象内部有另一个自定义对象,即 Company
.
contact对象包含更多字段,我只想检索一些字段
检索值的步骤我必须使用一个复杂的查询,我不能通过简单的 createCriteria
使用hibernate。
接触
@Entity
@Table(name = "contacts")
public class Contact
{
private String firstName;
private String lastName;
private Company company;
...
}
公司
@Entity
@Table(name = "companies")
public class Contact
{
private Integer id;
private String name;
...
}
sql查询
正如我在前面解释的那样,这个问题非常复杂,但为了便于书面和回答问题,我将其简化为最低限度:
SELECT a.first_name as firstName,
a.last_name as lastName,
a.company_id as companyId,
b.company_name as companyName
FROM contacts a
INNER JOIN companies b ON a.company_id = b.company_id
用户类型(公司类型)
创建 Company
对象我使用 UserType
下面是
public class CompanyType implements UserType
{
@Override
public int[] sqlTypes()
{
return new int[] { Types.INTEGER, Types.VARCHAR };
}
@SuppressWarnings("rawtypes")
@Override
public Class returnedClass()
{
return Company.class;
}
...
}
java
我目前正在以以下方式构建我的对象,它是否正常工作。。现在要感谢我的 UserType
我可以创建一个新的 Company
对象并设置id。
Type companyType = session.getTypeHelper().custom(CompanyType.class);
results = session.createSQLQuery(SQL_QUERY)
.addScalar("firstName", StandardBasicTypes.STRING)
.addScalar("lastName", StandardBasicTypes.STRING)
.addScalar("companyId", companyType)
.setResultTransformer(Transformers.aliasToBean(Contact.class))
.list();
我的目标是设置 Company
在之前创建的同一对象中(由id)。。我试图添加以下代码行,但出现错误,因为它试图分配新对象,而不是设置当前对象:
.addScalar("companyName", companyType)
2条答案
按热度按时间txu3uszq1#
不确定我是否完全理解该问题,但是否要设置联系人实体对象中嵌套实体(公司)的字段?如果这就是目标,那么简单的aliastobeanresulttransformer将无助于单级实体转换。对于涉及嵌套实体的转换,您需要使用aliastobeannestedresulttransformer-就像samiandoni在这里所做的那样-https://github.com/samiandoni/aliastobeannestedresulttransformer/blob/master/aliastobeannestedresulttransformer.java.
您可以这样使用它:-
hgc7kmma2#
您可以创建选定字段的dto对象,并将查询结果转换为dto。
transformers.aliastobean(ContactCompanyTo.class)
如果要使用实际的域对象,则可以轻松地将dto转换为域对象。