2009-10-01 7 views
1

J'ai vraiment besoin d'aide concernant celui-ci.Comment puis-je utiliser la clause sql case dans HQL?

Voici l'extrait de code:

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); 

Mais cela génère l'erreur ci-dessous:


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'' 

Quelle sera la requête correcte pour cela? Im essayant juste de soustraire 1 mois de l'insertdate.

Si vous pouvez aider, s'il vous plaît faire so..thanks :)

Répondre

0

Je crois que votre oublièrent la table que vous souhaitez interroger.

 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 ... j'ai juste oublié de le coller ici ... :) –

+0

ai-je besoin d'importer des classes pour ceci ou cas est pas supporté en hql? –

+0

** case ** est parfaitement supporté en hql (si la base de données sous-jacente le supporte). – KLE

0

Je suis tombé sur ce même problème récemment. Mon erreur est venue du fait que JPA attend le même nom de champs dans la requête ET dans la classe d'entité.


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

Dans la requête field1 est attendue et non Field1 ni FIELD1 et ainsi de suite ...

0

j'ai eu un problème similaire et la solution que Stephan. Nous utilisons des annotations JPA sur le getter mais le nom du champ commençait par un capital (ce qui n'est pas une bonne pratique de toute façon).

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

Je pense que lorsqu'Hibernate était mon nom de résout le terrain sur la base du getter, il cherchait un champ nommé myTime mais il n'y avait que MyTime. Le problème a été résolu quand j'ai renommé le champ avec la convention correcte de chameau (myTime)

Questions connexes