2012-03-09 47 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