如何直接从hibernate中的查询通过“setresulttransformer”和“addscalar”构建对象?

q43xntqr  于 2021-10-10  发布在  Java
关注(0)|答案(2)|浏览(312)

我的目标是创建我的 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)
txu3uszq

txu3uszq1#

不确定我是否完全理解该问题,但是否要设置联系人实体对象中嵌套实体(公司)的字段?如果这就是目标,那么简单的aliastobeanresulttransformer将无助于单级实体转换。对于涉及嵌套实体的转换,您需要使用aliastobeannestedresulttransformer-就像samiandoni在这里所做的那样-https://github.com/samiandoni/aliastobeannestedresulttransformer/blob/master/aliastobeannestedresulttransformer.java.
您可以这样使用它:-

results = session.createSQLQuery(SQL_QUERY)
        .addScalar("firstName", StandardBasicTypes.STRING)
        .addScalar("lastName", StandardBasicTypes.STRING)
        .addScalar("companyId", companyType)
        .setResultTransformer(new AliasToBeanNestedResultTransformer(Contact.class))
        .list();
hgc7kmma

hgc7kmma2#

您可以创建选定字段的dto对象,并将查询结果转换为dto。
transformers.aliastobean(ContactCompanyTo.class)

public class ContactCompanyDTO {
         private String firstName;
         private String lastName;
         private String companyName;
         private Integer id;

    }

如果要使用实际的域对象,则可以轻松地将dto转换为域对象。

相关问题