当前位置: 首页 > 面试题库 >

如何使用Hibernate转换平面结果集

韦修文
2023-03-14
问题内容

是否可以将SQL结果映射到非平面对象?

List<Customer> customers = hibernateSession().createCriteria(CustomerDetailsView.class)
                .add(Restrictions.in("userName", userName))
                .setProjection(buildProjection())
                .setResultTransformer(Transformers.aliasToBean(Customer.class))
                .list();

在我的情况下, CustomerDetailsView 具有扁平结构。但是我需要将其映射到这样的对象:

public class Customer {
    private String userName;
    private String title;
    private String firstName;
    private String lastName;
    private String type;
    private String companyName;
    private AddressDetails addressDetails;
}

public class AddressDetails {
    private String countryCode;
    private String addressLine1;
    private String zipOrPostCode;
    private String city;
    private String countryDivisionName;
    private String countryDivisionCode;
    private String countryDivisionTypeCode;
    private String residentialAddress;
}

问题答案:

是的,有可能。您可以为其使用自定义转换器:
FluentHibernateResultTransformer。

您可以复制粘贴代码,也可以通过Maven添加jar:fluent-hibernate-
core

您需要使用CriteriaProjections。请不要忘记指定投影别名(userNameaddressDetails.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别名会出错。

与本机SQL一起使用

该转换器可用于带有嵌套投影(与HQL相反)的本机SQL。在这种情况下,需要使用带引号的别名:

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();


 类似资料:
  • 我只需要使属性元素与 id 处于同一级别。 我只是有一个问题,以复制属性是在同一水平。 这是我的示例JSON 这是我的示例转换。 期望的输出将是

  • 问题内容: 由于使用JDBC连接器进行MySQL查询,因此我有一个结果集。所以我的工作是将结果集转换为JSON格式。这样我就可以将其作为AJAX响应发送到客户端。有人可以解释一下如何转换为JSON格式,因为我对Java和JSON都是新手 问题答案: 许多人正确地回答了这个问题。但是,我认为我可以使用以下几小段代码为该帖子添加更多价值。它使用Apache-DBUtils和Gson库。

  • 问题内容: 我的DAO中有一个hibernate的呼叫,看起来像这样 我收到一条错误消息,说我无法将结果列表转换为模型类型“关联”。我不明白为什么会这样。我只返回关联表中的字段。 问题答案: 您需要使用来指定要转换为结果的实体类,因为您正在执行对实体一无所知的SQL查询: 也可以看看: 18.1.2。实体查询

  • 问题内容: 我有一个mysqli查询,我需要将其格式化为移动应用程序的JSON。 我已经设法为查询结果生成一个XML文档,但是我正在寻找更轻量的东西。(有关我当前的XML代码,请参见下文) 问题答案: 这样的输出: 如果您想要其他样式,可以尝试以下方法: 输出将是这样的:

  • 输入 JSON : 预期输出JSON: 目前,我正在使用JOLTtransformJSON处理器和JOLT规范: 但我得到的输出要么是NULL,要么是原始JSON(带有差异规范)。提前感谢。

  • 我有以下代码,它从Marketo系统中获取一些数据 这将返回给我以下数据 我想做的是,保存这个返回到一个拼花文件。但是当我用下面的代码尝试时,我收到了一条错误消息。 我做错了什么?