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

如果未明确声明Transformer,则Hibernate如何与HQL查询一起使用

邴姚石
2023-03-14
问题内容

我不知道在哪里可以找到hibernate的实现机制。我有很多关于hibernate的问题,但是我们可以从这个问题入手:

如果有这样的HQL:

from B b
where b.x =: x
and b.y =: y

并查询如下代码:

Query query = session.createQuery(hql.toString());

将所有字段设置为B的默认转换器是什么?我发现这甚至不需要setter或getter来设置值。

或说,它和这个有什么区别:

Query query = session.createQuery(hql.toString()).setResultTransformer(Transformers.aliasToBean(B.class));

感谢您阅读本文,欢迎提出任何想法。


问题答案:

当使用默认的Transformer时,它期望类是hibernate实体,这意味着它必须与某些表进行映射,在第二种情况下,即

Query query=session.createQuery(hql.toString()).setResultTransformer(Transformers.aliasToBean(B.class));

B不是hibernate实体(没有映射到其简单POJO的任何表,没有任何hibernate特定的注释)

例如,有时候我们有一个类,我们想根据查询返回的数据填充数据。该类是一个简单的POJO,而不是Hibernate实体,因此Hibernate将无法识别此类。这可以在Hibernate中通过使用Transformers来完成。让我们看一个简单的示例,展示如何使用变形金刚。首先,让我们看一个简单的POJO类:“
UserActivityStat”。此类包含一些统计信息。我们想直接通过运行Hibernate HQL来填充实例的统计信息。

public static class UserActivityStat{
    private int totalPhotos;
    private int totalViews;
    public UserActivityStat() {   }
    public int getTotalPhotos() {
          return totalPhotos;
    }
    public void setTotalPhotos(int totalPhotos) {
         this.totalPhotos = totalPhotos;
    }
    public int getTotalViews() {
      return totalViews;
    }
    public void setTotalViews(int totalViews) {
        this.totalViews = totalViews;
    }
 }

现在,让我们看一个简单的方法,该方法使用hibernateHQL和Transformers类向“ UserActivityStat”实例填充数据

public UserActivityStat getUserActivityStat(User user) {
     return (UserActivityStat) hibernateSession.createQuery(
             "select count(*) as totalPhotos, sum(p.views) as totalViews " +
             "from Photo p " + 
             "where p.user = :user " +
             "p.dateCreated  <= :now")
         .setParameter("user", user)
         .setTimestamp("now", new Date())
         .setResultTransformer(Transformers.aliasToBean(UserActivityStat.class))
         .uniqueResult();
}

请注意,两列中的每列都有一个别名。该别名必须是“ UserActivityStat”类上的属性的名称。还要注意在“ Transformers”类中使用“
setResultTransformer”。



 类似资料:
  • 问题内容: 如何声明用于PostgreSQL 8.3查询的变量? 在MS SQL Server中,我可以这样做: 我如何在PostgreSQL中做同样的事情?根据文档,变量被简单地声明为“名称类型;”,但这给了我一个语法错误: 有人可以给我一个正确语法的例子吗? 问题答案: PostgreSQL中没有这样的功能。您只能在pl / PgSQL(或其他pl / *)中执行此操作,而不能在普通SQL中执

  • 我试图在OpenAPI 3中定义一个查询对象: 但示例值和架构未显示在 Swaager UI 中。 是有错误还是我错过了什么?

  • 本文向大家介绍请说明一下Hibernate如何实现分页查询?相关面试题,主要包含被问及请说明一下Hibernate如何实现分页查询?时的应答技巧和注意事项,需要的朋友参考一下 考察点:框架 参考回答: 通过Hibernate实现分页查询,开发人员只需要提供HQL语句(调用Session的createQuery()方法)或查询条件(调用Session的createCriteria()方法)、设置查询

  • 本文向大家介绍如何使用JSP声明来声明类的对象?,包括了如何使用JSP声明来声明类的对象?的使用技巧和注意事项,需要的朋友参考一下 声明声明了一个或多个变量或方法,您可以稍后在JSP文件中的Java代码中使用它们。在JSP文件中使用变量或方法之前,必须先声明该变量或方法。 以下是JSP声明的语法- 您可以编写与上述语法等效的XML,如下所示- 以下是JSP声明中对象声明的示例-

  • 我正在本地的Glassfish 4.1中运行一些概念验证。1(焊接2.2.2)关于CDI的安装。 我创建了一个名为TipicalBean的类bean,它注入了在生产者方法中生成的整数。 定义producer方法的类如下所示 这不工作。即使我声明方法静态 但如果将@Dependent作用域放在类定义中,它确实可以工作,如下所示: 此外,如果我在注入它的同一个类中声明生产者方法,我可以在生产者方法声明

  • 问题内容: 我总是将If语句(在C#中)用作(1.替代); 我知道没有必要将“ == true”写为(2.替代)); 但是,我使用它是因为它更具可读性,并且不会引起性能问题。当然,这是我的选择,而且我知道许多软件开发人员都喜欢第一种选择。最佳用法是什么,为什么? 问题答案: 如果布尔值的名称清楚地说明了它的含义,那么我将始终选择版本2。但是,有时您会陷入一个特别晦涩的变量名,至少不能更改它。现在就