【问题标题】:How to map result got from native query in hibernate?如何映射从休眠中的本机查询获得的结果?
【发布时间】:2017-10-16 19:26:13
【问题描述】:

我有一个查询,它的列比我的实体类的多。

为了不让hibernate投诉,我必须在字段中添加注释

@Transient
private Integer count;

但是这样做会使hibernate无法映射计数。假设我的查询是

session.createSQLQuery("SELECT p.*, count(p.id), sqrt(1+2) as distance FROM post p group by p.id")

我知道这个查询没有任何逻辑意义。这只是一个例子。从上面的查询返回的列将包含 post 中的所有内容和两个额外的列,计数和距离。我想将结果映射到我的entity,计数和距离用@Transient 注释,或者如果有更好的方法来映射结果。我很乐意这样做。目标不是在实体中执行此操作,而是在具有映射结果的class 中执行此操作。我试过打电话给addEntity(),但似乎没有帮助。

【问题讨论】:

  • 你真的需要一个实体作为结果吗?表示您要更改从该查询返回的数据吗?
  • 不,这就是为什么我说目标是拥有一个类而不是实体。我有实体只是因为我碰巧找到了一个使用实体来实现这一点的帖子,这是我尝试的最后一件事

标签: java hibernate


【解决方案1】:

您可以使用结果集转换器来实现这一点。

步骤 1 ) 创建一个新的 DTO 类,其中包含您查询要返回的所有字段

第 2 步)添加以下行

setResultTransformer( Transformers.aliasToBean(DTO.class))

例子:

List resultWithAliasedBean = session.createQuery(
  "SELECT p.*, count(p.id), sqrt(1+2) as distance FROM post p group by p.id")
  .setResultTransformer(Transformers.aliasToBean(DTO.class))
  .list();

DTO dto = (DTO) resultWithAliasedBean.get(0);

注意:确保 DTO 类中的字段名称与查询返回的列名称匹配。

【讨论】:

    【解决方案2】:

    我看到您正在使用 Hibernate,所以 Yathish 的答案可以正常工作。

    但是如果你想用 JPA 规范来做,那么你可以使用结果集映射

    Query q = em.createNativeQuery(
        "SELECT c.id, c.name, COUNT(o) as orderCount, AVG(o.price) AS avgOrder " +
        "FROM Customer c " +
        "JOIN Orders o ON o.cid = c.id " +
        "GROUP BY c.id, c.name",
        "CustomerDetailsResult");
    
    @SqlResultSetMapping(name="CustomerDetailsResult",
        classes={
            @ConstructorResult(targetClass=com.acme.CustomerDetails.class,
                columns={
                    @ColumnResult(name="id"),
                    @ColumnResult(name="name"),
                    @ColumnResult(name="orderCount"),
                    @ColumnResult(name="avgOrder", type=Double.class)})
        })
    

    您必须在此处指定从 SQL 结果集到 DTO 的列的映射。

    如果您认为这很复杂,有一个名为 QLRM(Query Lanaguage Result Mapper)的开源项目可以将任何 SQL 语句映射到 POJO。

    http://simasch.github.io/qlrm/

    最后但并非最不重要的一点是,如果您要进行广泛的 SQL 处理,为什么不看看 jOOQ:https://www.jooq.org/

    【讨论】:

      猜你喜欢
      • 2020-12-08
      • 2016-12-05
      • 1970-01-01
      • 2016-05-02
      • 2016-06-14
      • 1970-01-01
      • 2021-09-24
      • 2011-05-03
      • 1970-01-01
      相关资源
      最近更新 更多