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

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

我的目标是创建我的 Contact 对象直接来自查询和hibernate,其特点主要有三个:
contact对象内部有另一个自定义对象,即 Company .
contact对象包含更多字段,我只想检索一些字段
检索值的步骤​​我必须使用一个复杂的查询,我不能通过简单的 createCriteria 使用hibernate。

接触

  1. @Entity
  2. @Table(name = "contacts")
  3. public class Contact
  4. {
  5. private String firstName;
  6. private String lastName;
  7. private Company company;
  8. ...
  9. }

公司

  1. @Entity
  2. @Table(name = "companies")
  3. public class Contact
  4. {
  5. private Integer id;
  6. private String name;
  7. ...
  8. }

sql查询

正如我在前面解释的那样,这个问题非常复杂,但为了便于书面和回答问题,我将其简化为最低限度:

  1. SELECT a.first_name as firstName,
  2. a.last_name as lastName,
  3. a.company_id as companyId,
  4. b.company_name as companyName
  5. FROM contacts a
  6. INNER JOIN companies b ON a.company_id = b.company_id

用户类型(公司类型)

创建 Company 对象我使用 UserType 下面是

  1. public class CompanyType implements UserType
  2. {
  3. @Override
  4. public int[] sqlTypes()
  5. {
  6. return new int[] { Types.INTEGER, Types.VARCHAR };
  7. }
  8. @SuppressWarnings("rawtypes")
  9. @Override
  10. public Class returnedClass()
  11. {
  12. return Company.class;
  13. }
  14. ...
  15. }

java

我目前正在以以下方式构建我的对象,它是否正常工作。。现在要感谢我的 UserType 我可以创建一个新的 Company 对象并设置id。

  1. Type companyType = session.getTypeHelper().custom(CompanyType.class);
  2. results = session.createSQLQuery(SQL_QUERY)
  3. .addScalar("firstName", StandardBasicTypes.STRING)
  4. .addScalar("lastName", StandardBasicTypes.STRING)
  5. .addScalar("companyId", companyType)
  6. .setResultTransformer(Transformers.aliasToBean(Contact.class))
  7. .list();

我的目标是设置 Company 在之前创建的同一对象中(由id)。。我试图添加以下代码行,但出现错误,因为它试图分配新对象,而不是设置当前对象:

  1. .addScalar("companyName", companyType)
txu3uszq

txu3uszq1#

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

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

hgc7kmma2#

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

  1. public class ContactCompanyDTO {
  2. private String firstName;
  3. private String lastName;
  4. private String companyName;
  5. private Integer id;
  6. }

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

相关问题