Spring Data JPA could not instantiate class

I have problem with my code.

I paste below my DAO interface:

public interface EventDao extends CrudRepository<Event, Integer>{
...
@Query("SELECT new com.patryk.entity.ActionStatistics(e.action.actionname,sum(e.lengthinmilis)) FROM Event e where e.user = ?1 and e.removed = 0 and year(e.createdate) = year(?2) and month(e.createdate)=month(?2) and e.action.isworkingaction = 1")
public List<ActionStatistics> findMonthlyUserStatisticsByUserAndCreateDay(User user, Date createday);
...
}

ActionStatistics Class:

        package com.patryk.entity;

        import java.text.SimpleDateFormat;
        import java.util.Date;
        import java.util.TimeZone;

        public class ActionStatistics {

            private String actionname;
            private long time;
            private String timeString;

            public ActionStatistics() {
                this.actionname = "actionname";
                this.time = 0;
            }

            public ActionStatistics(String actionname, long time) {
                this.actionname = actionname;
                this.time = time;
            }

            public String getActionname() {
                return actionname;
            }

            public void setActionname(String actionname) {
                this.actionname = actionname;
            }

            public long getTime() {
                return time;
            }

            public void setTime(long time) {
                this.time = time;
            }

            public String getTimeString() {
                SimpleDateFormat sdt = new SimpleDateFormat("HH:mm:ss");
                sdt.setTimeZone(TimeZone.getTimeZone("UTC"));
                return sdt.format(new Date(getTime()));
            }

            public void setTimeString(String timeString) {
                this.timeString = timeString;
            }

            @Override
            public String toString() {
                return "ActionStatistics{" + "actionname=" + actionname + ", time=" + time + ", timeString=" + timeString + '}';
            }
        }

I get error like this, my stacktrace:

2016-12-04 15:49:45.218 ERROR 7224 --- [nio-8084-exec-6] o.a.c.c.C.[.[.[/].[dispatcherServlet]    : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.springframework.dao.InvalidDataAccessApiUsageException: org.hibernate.QueryException: could not instantiate class [com.patryk.entity.ActionStatistics] from tuple; nested exception is java.lang.IllegalArgumentException: org.hibernate.QueryException: could not instantiate class [com.patryk.entity.ActionStatistics] from tuple] with root cause

java.lang.IllegalArgumentException: null
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) ~[na:1.8.0_111]
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) ~[na:1.8.0_111]
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) ~[na:1.8.0_111]
at java.lang.reflect.Constructor.newInstance(Constructor.java:423) ~[na:1.8.0_111]
...
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) [na:1.8.0_111]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) [na:1.8.0_111]
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) [tomcat-embed-core-8.5.4.jar:8.5.4]
at java.lang.Thread.run(Thread.java:745) [na:1.8.0_111]

Query which throw exception:

mysql> select action1_.actionName as col_0_0_, sum(event0_.lengthInSec) as col_1_0_ from Events event0_, Actions action1_ where event0_.actionID=action1_.actionID and event0_.userID=2 and event0_.removed=0 and year(event0_.createDate)=year(now()) and month(event0_.createDate)=month(now()) and action1_.isWorkingAction=1;
+----------+----------+
| col_0_0_ | col_1_0_ |
+----------+----------+
| NULL     |     NULL |
+----------+----------+
1 row in set (0.00 sec)
mysql> 

Where am I doing something wrong ? How I can solve it ?


Solution 1:

I think your time attribute should be Long to support null. Rememeber, primitive types doesnt support null

From:

private long time;

To:

private Long time;

Also change getters/setters

Solution 2:

Change private long time; to private Long time;