2009-10-01 54 views
1

我真的需要這方面的幫助。如何在HQL中使用sql case子句?

這裏是代碼片段:

hSql=" select case 
     when min(start_day_plan) is not NULL then min(start_day_plan) 
     else to_date((min(insertDate)) - cast('1 month' as interval),'yyyy-MM-dd') 
     end 
     from Project" 

    getHibernateTemplate().find(hSql); 

但是,這產生以下錯誤:


java.lang.IllegalStateException: No data type for node: org.hibernate.hql.ast.tree.CaseNode 
\-[CASE] CaseNode: 'case' 
    +-[WHEN] SqlNode: 'when' 
    | +-[IS_NOT_NULL] UnaryLogicOperatorNode: 'is not null' 
    | | \-[AGGREGATE] AggregateNode: 'min' 
    | |  \-[IDENT] IdentNode: 'start_day_plan' {originalText=start_day_plan} 
    | \-[AGGREGATE] AggregateNode: 'min' 
    |  \-[IDENT] IdentNode: 'start_day_plan' {originalText=start_day_plan} 
    \-[ELSE] SqlNode: 'else' 
     \-[METHOD_CALL] MethodNode: '(' 
      +-[METHOD_NAME] IdentNode: 'to_date' {originalText=to_date} 
      \-[EXPR_LIST] SqlNode: 'exprList' 
      +-[MINUS] BinaryArithmeticOperatorNode: '-' {[email protected]} 
      | +-[AGGREGATE] AggregateNode: 'min' 
      | | \-[IDENT] IdentNode: 'insertDate' {originalText=insertDate} 
      | \-[METHOD_CALL] MethodNode: '(' 
      |  +-[METHOD_NAME] IdentNode: 'cast' {originalText=cast} 
      |  \-[EXPR_LIST] SqlNode: 'exprList' 
      |  +-[QUOTED_STRING] LiteralNode: ''1 month'' 
      |  \-[IDENT] IdentNode: 'interval' {originalText=interval} 
      \-[QUOTED_STRING] LiteralNode: ''yyyy-MM-dd'' 

什麼將是這個正確的查詢?即時通訊只是試圖從insertdate減去1個月。

如果你能幫忙,請不要so..thanks :)

回答

0

我相信你忘了你要查詢的表。

 select 
     case 
     when min(start_day_plan) is not NULL then min(start_day_plan) 
     else to_date((min(insertDate)) - cast('1 month' as interval),'yyyy-MM-dd') 
     end 
    from MyTable 
+0

ooppss ...我只是忘了將它粘貼在這裏... :) – 2009-10-01 08:53:36

+0

我需要導入類爲這種情況或案件是不支持在hql中? – 2009-10-01 09:33:30

+0

** case **在hql中完全支持(如果底層數據庫支持它)。 – KLE 2009-10-01 09:41:07

0

最近我偶然發現了同樣的問題。我的錯誤來自JPA期望實體類中的查詢中的相同字段名稱。


@Entity 
public class Foo { 
    private String field1; 
    ... 
} 

在查詢field1預期,而不是Field1也不FIELD1等等...

0

我也有類似的問題和解決方案比Stephan。我們在getter上使用JPA註釋,但字段名稱以大寫字母開頭(反正這不是一個好習慣)。

private Timestamp MyTime; 
... 
@Column(name = "MYTIME") 
public Timestamp getMyTime() { 
    return MyTime; 
} 

我覺得當Hibernate是基於它在找一個叫myTime場,吸氣解決我的字段名,但只有MyTime。當我用正確的駱駝案例約定(myTime