Как я могу использовать предложение SQL в HQL? - PullRequest
1 голос
/ 01 октября 2009

Мне действительно нужна помощь по этому поводу.

Вот фрагмент кода:

  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: '-' {dataType=org.hibernate.type.DoubleType@bb21ab}
             |  +-[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''

что будет правильным запросом для этого? я просто пытаюсь вычесть 1 месяц из даты вставки.

Если бы вы могли помочь, пожалуйста, сделайте это ... спасибо:)

Ответы [ 3 ]

0 голосов
/ 20 мая 2011

Я недавно наткнулся на эту же проблему. Моя ошибка произошла из-за того, что JPA ожидает то же имя поля в запросе AND в классе сущности.


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

В запросе field1 ожидается, а не Field1, ни FIELD1 и так далее ...

0 голосов
/ 20 ноября 2012

У меня была похожая проблема и решение, чем Стефан . Мы используем аннотации JPA на получателе, но имя поля начиналось с заглавной буквы (что в любом случае не является хорошей практикой).

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

Я думаю, что когда Hibernate разрешал имя моего поля на основе метода получения, он искал поле с именем myTime, но было только MyTime. Проблема была решена, когда я переименовал поле с правильным соглашением о случае верблюдов (myTime)

0 голосов
/ 01 октября 2009

Мне кажется, вы забыли таблицу, которую хотите запросить.

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