Java 无法将sql(jpa查询)返回的列转换为自定义类

Java 无法将sql(jpa查询)返回的列转换为自定义类,java,spring,spring-boot,jpa,repository,Java,Spring,Spring Boot,Jpa,Repository,有人问过这个问题,但我无法解决我的问题 上一个问题: 在我的项目中,我有一个自定义类,定义如下: public class VerticalBarChartDomain { private String name; private Long value; // constructors public VerticalBarChartDomain() { // TODO Auto-generated constructor stub }

有人问过这个问题,但我无法解决我的问题

上一个问题:

在我的项目中,我有一个自定义类,定义如下:

public class VerticalBarChartDomain {

    private String name;
    private Long value;
    // constructors
    public VerticalBarChartDomain() {
        // TODO Auto-generated constructor stub
    }
    public VerticalBarChartDomain(String name, Long value) {
        super();
        this.name = name;
        this.value = value;
    }
    //getters and setters
    public String getName() {
        return name;
    }
    public Long getValue() {
        return value;
    }
    public void setName(String name) {
        this.name = name;
    }
    public void setValue(Long value) {
        this.value = value;
    }

}
@Query(value="select   new in.net.rserver.domain.VerticalBarChartDomain( DATE(r.start_time), count(distinct(r.ride_id)) ) from ride r where  r.start_time >= date_sub(curdate(), interval 6 day) group by DATE(r.start_time)",nativeQuery=true)
    public List<VerticalBarChartDomain> getRidesPerDayForVBChart();
com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '.net.yaana.server.rserver.domain.VerticalBarChartDomain(DATE(r.start_time), coun' at line 1
    at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) ~[na:na]
    at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) ~[na:na]
    at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) ~[na:na]
    at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:488) ~[na:na]
    at com.mysql.jdbc.Util.handleNewInstance(Util.java:425) ~[mysql-connector-java-5.1.43.jar:5.1.43]
    at com.mysql.jdbc.Util.getInstance(Util.java:408) ~[mysql-connector-java-5.1.43.jar:5.1.43]
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:943) ~[mysql-connector-java-5.1.43.jar:5.1.43]
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3973) ~[mysql-connector-java-5.1.43.jar:5.1.43]
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3909) ~[mysql-connector-java-5.1.43.jar:5.1.43]
    at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2527) ~[mysql-connector-java-5.1.43.jar:5.1.43]
    at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2680) ~[mysql-connector-java-5.1.43.jar:5.1.43]
    at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2494) ~[mysql-connector-java-5.1.43.jar:5.1.43]
    at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:1858) ~[mysql-connector-java-5.1.43.jar:5.1.43]
    at com.mysql.jdbc.PreparedStatement.executeQuery(PreparedStatement.java:1966) ~[mysql-connector-java-5.1.43.jar:5.1.43]
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na]
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:na]
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na]
    at java.base/java.lang.reflect.Method.invoke(Method.java:564) ~[na:na]
在JPA存储库中,我有一个查询,如下所示

public class VerticalBarChartDomain {

    private String name;
    private Long value;
    // constructors
    public VerticalBarChartDomain() {
        // TODO Auto-generated constructor stub
    }
    public VerticalBarChartDomain(String name, Long value) {
        super();
        this.name = name;
        this.value = value;
    }
    //getters and setters
    public String getName() {
        return name;
    }
    public Long getValue() {
        return value;
    }
    public void setName(String name) {
        this.name = name;
    }
    public void setValue(Long value) {
        this.value = value;
    }

}
@Query(value="select   new in.net.rserver.domain.VerticalBarChartDomain( DATE(r.start_time), count(distinct(r.ride_id)) ) from ride r where  r.start_time >= date_sub(curdate(), interval 6 day) group by DATE(r.start_time)",nativeQuery=true)
    public List<VerticalBarChartDomain> getRidesPerDayForVBChart();
com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '.net.yaana.server.rserver.domain.VerticalBarChartDomain(DATE(r.start_time), coun' at line 1
    at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) ~[na:na]
    at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) ~[na:na]
    at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) ~[na:na]
    at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:488) ~[na:na]
    at com.mysql.jdbc.Util.handleNewInstance(Util.java:425) ~[mysql-connector-java-5.1.43.jar:5.1.43]
    at com.mysql.jdbc.Util.getInstance(Util.java:408) ~[mysql-connector-java-5.1.43.jar:5.1.43]
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:943) ~[mysql-connector-java-5.1.43.jar:5.1.43]
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3973) ~[mysql-connector-java-5.1.43.jar:5.1.43]
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3909) ~[mysql-connector-java-5.1.43.jar:5.1.43]
    at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2527) ~[mysql-connector-java-5.1.43.jar:5.1.43]
    at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2680) ~[mysql-connector-java-5.1.43.jar:5.1.43]
    at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2494) ~[mysql-connector-java-5.1.43.jar:5.1.43]
    at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:1858) ~[mysql-connector-java-5.1.43.jar:5.1.43]
    at com.mysql.jdbc.PreparedStatement.executeQuery(PreparedStatement.java:1966) ~[mysql-connector-java-5.1.43.jar:5.1.43]
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na]
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:na]
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na]
    at java.base/java.lang.reflect.Method.invoke(Method.java:564) ~[na:na]

请纠正我的错误。

好吧,这应该是SQL。和.net.rserver.domain.VerticalBarChartDomain(…)中的新的
不是有效的SQL。它将是有效的JPQL,但JPQL与SQL语言不同,查询的其余部分不是有效的JPQL。简而言之,你在写java中的一半,剩下的C++。没有什么能执行这样的事情。只需返回两列,遍历查询将返回的列表,并将每个对象数组转换为VerticalBarChartDomain的一个实例。@JBNizet,感谢您告知我的错误,您能告诉我如何访问对象的列吗?我不知道您的意思。假设查询返回,#ride_date,rides'2018-06-14',15''2018-06-15',40''2018-06-16',53''2018-06-17',74''2018-06-18',31',在对象[]列表中,如何从ObjectWell行[0]中获取每一列是该行的第一个元素,而行[1]是第二个元素。这是一个数组。它与所有其他阵列一样工作。