You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@openjpa.apache.org by Lu Jiang <je...@gmail.com> on 2010/08/20 10:12:41 UTC

NullPointer Exception when using Case Expressions

Hi,all
I am experiencing the JPA 2.0 new features using openjpa 2.0,but
currently I was trapped.
I defined a entity class Student
@Entity
public class Student implements Serializable {
    @Id
    private Integer id;
...
    private double totalScore;
    private String rank;
    //getters and setters
}
When I tried to simply update the rank,it all works fine.
  public void updateRank(Integer id) {
       String jpql="UPDATE  Student  s "
                + "SET s.rank= 'F' "
                + " WHERE s.id = " + id;
        Query query = em.createQuery(jpql);
        query.executeUpdate();
    }

but when I tried to update the rank according to totalScore in the
following method.

  public void updateRank(Integer id) {
        String jpql = "UPDATE Student s "
                + "SET s.rank= "
                + " CASE WHEN s.totalScore<20 Then 'D' "
                + " WHEN s.totalScore>=20 AND s.totalScore<30 Then 'C' "
                + " WHEN s.totalScore>=30 AND s.totalScore<40 Then 'B' "
                + " WHEN s.totalScore>=40 AND s.totalScore<50 Then 'A' "
                + " Else 'N/A' "
                + " END "
                + " WHERE s.id = " + id;
        Query query = em.createQuery(jpql);
        query.executeUpdate();
    }

Error like below will occur.
Exception in thread "main" <openjpa-2.0.0-r422266:935683 nonfatal user
error> org.apache.openjpa.persistence.ArgumentException: null
        at org.apache.openjpa.kernel.QueryImpl.execute(QueryImpl.java:827)
        at org.apache.openjpa.kernel.QueryImpl.updateAll(QueryImpl.java:898)
        at org.apache.openjpa.kernel.QueryImpl.updateAll(QueryImpl.java:894)
        at org.apache.openjpa.kernel.DelegatingQuery.updateAll(DelegatingQuery.java:582)
        at org.apache.openjpa.persistence.QueryImpl.executeUpdate(QueryImpl.java:348)
        at org.apache.geronimo.sample.jpa20.bean.Facade.updateRank(Facade.java:158)
        at org.apahce.geronimo.sample.jpa20.test.updateRank.main(updateRank.java:20)
Caused by: java.lang.NullPointerException
        at org.apache.openjpa.jdbc.kernel.exps.AndExpression.appendTo(AndExpression.java:68)
        at org.apache.openjpa.jdbc.kernel.exps.WhenCondition.appendTo(WhenCondition.java:70)
        at org.apache.openjpa.jdbc.kernel.exps.GeneralCaseExpression.appendTo(GeneralCaseExpression.java:114)
        at org.apache.openjpa.jdbc.sql.DBDictionary.appendUpdates(DBDictionary.java:2127)
        at org.apache.openjpa.jdbc.sql.DBDictionary.toBulkOperation(DBDictionary.java:2021)
        at org.apache.openjpa.jdbc.sql.DBDictionary.toUpdate(DBDictionary.java:1933)

Does anyone have idea of this kind of issue?Or I got something wrong
with the jpql sentence?Hope someone can give me some clue:)Thanks in
advance!

Re: NullPointer Exception when using Case Expressions

Posted by Lu Jiang <je...@gmail.com>.
Hi Catalina
Thanks a lot for your sugguestion.
I tried to changed openjpa from 2.0.0 version to
2.1.0-snapshot.However ,the same exception occured.Actuall I don't
know why this happened..maybe I need more time to dig into it and find
the problem out.Anyway,thanks for your kind reply.

Re: NullPointer Exception when using Case Expressions

Posted by catalina wei <ca...@gmail.com>.
Hi Lu,
The trunk level code works fine, could you try OpenJPA SNAPSHOT version
2.1.0 ?

Here is SQL trace from running on DB2 using openjpa-2.1.0.SNAPSHOT:

10890  TRACE  [main] openjpa.Query - Executing query: UPDATE Student2 s SET
s.rank=  CASE WHEN s.totalScore<20 Then 'D'  WHEN s.totalScore>=20 AND
s.totalScore<30 Then 'C'  WHEN s.totalScore>=30 AND s.totalScore<40 Then
'B'  WHEN s.totalScore>=40 AND s.totalScore<50 Then 'A'  Else 'N/A'  END
WHERE s.id = 10
10906  TRACE  [main] openjpa.jdbc.SQL - <t 26780509, conn 12252334>
executing prepstmnt 31090792 UPDATE Student2 t0 SET t0.rank =  CASE  WHEN
t0.totalScore < CAST(? AS DOUBLE) THEN 'D' WHEN t0.totalScore >= CAST(? AS
DOUBLE) AND t0.totalScore < CAST(? AS DOUBLE) THEN 'C' WHEN t0.totalScore >=
CAST(? AS DOUBLE) AND t0.totalScore < CAST(? AS DOUBLE) THEN 'B' WHEN
t0.totalScore >= CAST(? AS DOUBLE) AND t0.totalScore < CAST(? AS DOUBLE)
THEN 'A' ELSE 'N/A' END  WHERE (t0.id = CAST(? AS BIGINT)) [params=?, ?, ?,
?, ?, ?, ?, ?]
10906  TRACE  [main] openjpa.jdbc.SQL - <t 26780509, conn 12252334> [0 ms]
spent

Catlaina
On Fri, Aug 20, 2010 at 1:12 AM, Lu Jiang <je...@gmail.com> wrote:

> Hi,all
> I am experiencing the JPA 2.0 new features using openjpa 2.0,but
> currently I was trapped.
> I defined a entity class Student
> @Entity
> public class Student implements Serializable {
>    @Id
>    private Integer id;
> ...
>    private double totalScore;
>    private String rank;
>    //getters and setters
> }
> When I tried to simply update the rank,it all works fine.
>  public void updateRank(Integer id) {
>       String jpql="UPDATE  Student  s "
>                + "SET s.rank= 'F' "
>                + " WHERE s.id = " + id;
>        Query query = em.createQuery(jpql);
>        query.executeUpdate();
>    }
>
> but when I tried to update the rank according to totalScore in the
> following method.
>
>  public void updateRank(Integer id) {
>        String jpql = "UPDATE Student s "
>                + "SET s.rank= "
>                + " CASE WHEN s.totalScore<20 Then 'D' "
>                + " WHEN s.totalScore>=20 AND s.totalScore<30 Then 'C' "
>                + " WHEN s.totalScore>=30 AND s.totalScore<40 Then 'B' "
>                + " WHEN s.totalScore>=40 AND s.totalScore<50 Then 'A' "
>                + " Else 'N/A' "
>                + " END "
>                + " WHERE s.id = " + id;
>        Query query = em.createQuery(jpql);
>        query.executeUpdate();
>    }
>
> Error like below will occur.
> Exception in thread "main" <openjpa-2.0.0-r422266:935683 nonfatal user
> error> org.apache.openjpa.persistence.ArgumentException: null
>        at org.apache.openjpa.kernel.QueryImpl.execute(QueryImpl.java:827)
>        at org.apache.openjpa.kernel.QueryImpl.updateAll(QueryImpl.java:898)
>        at org.apache.openjpa.kernel.QueryImpl.updateAll(QueryImpl.java:894)
>        at
> org.apache.openjpa.kernel.DelegatingQuery.updateAll(DelegatingQuery.java:582)
>        at
> org.apache.openjpa.persistence.QueryImpl.executeUpdate(QueryImpl.java:348)
>        at
> org.apache.geronimo.sample.jpa20.bean.Facade.updateRank(Facade.java:158)
>        at
> org.apahce.geronimo.sample.jpa20.test.updateRank.main(updateRank.java:20)
> Caused by: java.lang.NullPointerException
>        at
> org.apache.openjpa.jdbc.kernel.exps.AndExpression.appendTo(AndExpression.java:68)
>        at
> org.apache.openjpa.jdbc.kernel.exps.WhenCondition.appendTo(WhenCondition.java:70)
>        at
> org.apache.openjpa.jdbc.kernel.exps.GeneralCaseExpression.appendTo(GeneralCaseExpression.java:114)
>        at
> org.apache.openjpa.jdbc.sql.DBDictionary.appendUpdates(DBDictionary.java:2127)
>        at
> org.apache.openjpa.jdbc.sql.DBDictionary.toBulkOperation(DBDictionary.java:2021)
>        at
> org.apache.openjpa.jdbc.sql.DBDictionary.toUpdate(DBDictionary.java:1933)
>
> Does anyone have idea of this kind of issue?Or I got something wrong
> with the jpql sentence?Hope someone can give me some clue:)Thanks in
> advance!
>