2012-03-09 30 views
6

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

select e.class, e.name from Entity e 

Hibernate返回一个Integer(例如[12,“name”])而不是类对象。我怎样才能返回一个Java类,或者至少是类或实体的名字?或者,如果这不可能,我该如何将12转换成Java类?

出于性能方面的原因,我不能查询完整的对象,即我不能做

select e from Entity 

问候, 约亨

回答

8

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

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

如果你是Hibernate3中的session.iterate()的返回实体HibernateProxy只有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()); 
} 
1

标HQL,其中明确规定了SELECT子句中的列名将返回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

+0

打我吧:)当你选择的实体,您可以使用常规的java getClass调用来知道返回的类。 – 2012-03-09 08:54:01

+0

嗨,我不能那样做,因为我用两百个不同的类来查询两个gazillion记录。由此产生的查询会太慢。 – Jochen 2012-03-09 09:05:30

+0

你可以在HQL中应用一些where子句吗? – 2012-03-09 09:19:05

0

如果要限制在选择列表的列数,你可以在hql里面的new运营商。

也就是说,

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

此外,在Entity类,这种查询可以使用添加相应的构造函数。

这会给你List<Entity>,初始化只有2个值。

当您需要执行大型对象的快照时,这非常有用。例如,请阅读here获取API文档或here

+1

我试过这个,但它没有与类参数一起使用。离开e.class的作品。 – Jochen 2012-03-11 00:04:45

+0

数据库中** Class **的相应值是什么?我希望它是一个字符串,然后你需要设置字符串并尝试从它获取**类**。 – ManuPK 2012-03-11 06:22:53

+0

它是Hibernate的一个内置属性。例如。在查询中,您可以执行'从实体e中选择e.name,其中e.class = Person'。但是'select e.class'将返回一个int,我需要映射到一个类。 – Jochen 2012-03-14 03:31:23

4

,你可以只使用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

但这不是HQL。 – 2014-08-24 13:48:29