【问题标题】:How to select an object's class in Hibernate HQL?如何在 HIbernate HQL 中选择对象的类?
【发布时间】:2012-03-26 17:34:38
【问题描述】:

如何在 HQL 中选择对象的类?当我执行以下操作时:

select e.class, e.name from Entity e

Hibernate 返回一个整数(例如 [12, "name"])而不是类对象。如何返回 Java 类,或者至少返回类或实体名称?或者,如果这不可能,我如何将 12 转换为 Java 类?

出于性能原因,我无法查询完整的对象,即我做不到

select e from Entity

问候, 乔辰

【问题讨论】:

    标签: hibernate hql


    【解决方案1】:

    如果你是hibernate4,你可以使用HQL函数'type()'来获取实体类型

    select type(e), e.name from Entity e
    

    如果你是hibernate3,session.iterate()返回实体为HibernateProxy,只有id,你可以从它获取实体名和id,无需初始化。

    Iterator iterator = session.createQuery("from Entity e").iterate();
    while(iterator.hasNext()) {
        HibernateProxy object = (HibernateProxy)iterator.next();
        System.out.println(object.getHibernateLazyInitializer().getIdentifier());
        System.out.println(object.getHibernateLazyInitializer().getEntityName());
    }
    

    【讨论】:

      【解决方案2】:

      你可以使用 addEntity() 方法告诉 Hibernate 使用你的类来映射答案

       Query query = session.createSQLQuery(
          "select e.class,e.name from Entity e where <your conditions>")
          .addEntity(Entity.class)
          List<Entity> result = query.list();
      

      【讨论】:

        【解决方案3】:

        在 select 子句中明确指定列名的标量 HQL 将返回 object[] 列表。返回数组中的每个索引都与 select 子句中的相应列匹配。

        要返回对象列表,请使用select e from Entity e 或简单地使用from Entity

        List<Entity> result =   (List<Entity>) session.createQuery("from Entity").list();
        

        为了限制 HQL 返回的记录,在 HQL 的 where 子句中应用一些条件,例如:from Entity e where e.name = xxxxx

        【讨论】:

        • 打败我 :) 选择实体后,可以使用常规 java getClass 调用来了解返回的类。
        • 嗨,我不能那样做,因为我要查询两条包含 100 多个不同类别的数不胜数的记录。结果查询太慢了。
        • 你能在 HQL 中应用一些 where 子句吗?
        【解决方案4】:

        如果您想限制选择列表中的列数,可以在hql 中使用new 运算符。

        也就是说,

        select new Entity(e.class, e.name) from Entity e
        

        另外,在 Entity 类中添加一个对应的构造函数,这个查询可以使用。

        这将为您提供List&lt;Entity&gt;,仅使用 2 个值进行初始化。

        当您需要以执行方式获取大对象的快照时,这很有帮助。阅读 here 获取 API 文档或阅读 here 获取示例。

        【讨论】:

        • 我试过这个,但它不适用于类参数。省略 e.class 工作。
        • DB中Class对应的值是多少?我希望它是一个字符串,那么你需要设置字符串并尝试从中获取class
        • 它是 Hibernate 的内置属性。例如。在查询中你可以做select e.name from Entity e where e.class = Person。但是select e.class 将返回一个 int,我需要将其映射到一个类。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-06-05
        • 1970-01-01
        • 2010-12-12
        • 2019-07-13
        • 1970-01-01
        • 2011-01-02
        • 2011-07-22
        相关资源
        最近更新 更多