Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/392.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring Boot JPA RESTful找不到能够从类型[java.lang.String]转换为类型复合键的转换器_Java_Spring_Hibernate_Jpa_Spring Boot - Fatal编程技术网

Spring Boot JPA RESTful找不到能够从类型[java.lang.String]转换为类型复合键的转换器

Spring Boot JPA RESTful找不到能够从类型[java.lang.String]转换为类型复合键的转换器,java,spring,hibernate,jpa,spring-boot,Java,Spring,Hibernate,Jpa,Spring Boot,我正在尝试将spring boot应用程序连接到mysql数据库。在我尝试将一个具有嵌入ID的实体映射到另一个具有另一个嵌入ID的实体之前,一切似乎都正常 在这里,我有一个请求表和一个承诺表。一个请求可以有很多承诺 请求(pid、sttime、extime、endtime、minfund、maxfund、status) 请求id具有pid,sttime作为复合键 质押(pid、sttime、extime、endtime、minfund、maxfund、status) 质押id有四个键,pid、s

我正在尝试将spring boot应用程序连接到mysql数据库。在我尝试将一个具有嵌入ID的实体映射到另一个具有另一个嵌入ID的实体之前,一切似乎都正常

在这里,我有一个请求表和一个承诺表。一个请求可以有很多承诺

请求(pid、sttime、extime、endtime、minfund、maxfund、status)

请求id具有pid,sttime作为复合键

质押(pid、sttime、extime、endtime、minfund、maxfund、status)

质押id有四个键,pid、sttime、uemail和质押时间,其中pid和sttime都引用了请求

import javax.persistence.*;
import java.util.Collection;
import java.util.Date;

@Entity
public class Request {

    @EmbeddedId
    private RequestId requestId;

    @Temporal(TemporalType.TIMESTAMP)
    private Date extime;
    @Temporal(TemporalType.TIMESTAMP)
    private Date endtime;
    private int minfund;
    private int maxfund;
    @Enumerated(EnumType.STRING)
    @Column(name = "status")
    private RequestStatus status;

    @OneToMany(mappedBy = "pledgeId.request")
    private Collection<Pledge> pledges;

    protected Request(){}

    public Request(RequestId requestId, Date extime, Date endtime, int minfund, int maxfund, RequestStatus status) {
        this.requestId = requestId;
        this.extime = extime;
        this.endtime = endtime;
        this.minfund = minfund;
        this.maxfund = maxfund;
        this.status = status;
    }
    ...
    getters and setters
    ...
    @Override
    public String toString() {
        return String.format(
                "Request[pid='%s', sttime='%s', extime='%s', endtime='%s', minfund='%s', maxfund='%s', status='%s']",
                requestId.getProject().getPid(), requestId.getSttime(), extime, endtime, minfund, maxfund, status);
    }
}
-

我无法查询某个请求的每个承诺。 例如

“未找到能够从[java.lang.String]类型转换为[crowdfunding.entity.RequestId]类型的转换器”


编辑:我还试图重写toString()方法,以便它在暴露时返回一个可以查询自身的API,但似乎不起作用。

我相信找不到的转换器是一个用于转换路径参数的REST转换器(此处已解码):
“RequestId{project=1,sttime=2017-04-16 12:00:00.0”
到实际的
请求ID
对象。在Spring的REST层中搜索答案,而不是在JPA中@NikosParaskevopoulos感谢您的回复。你打开了我的心扉。你能再给我解释一下吗。我还是有点困惑。我应该创建一个转换器来解析输入吗?这里是答案!!!
import javax.persistence.*;
import java.io.Serializable;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.Date;

@Embeddable
public class RequestId implements Serializable {
//    default serial version id, required for serializable classes.
    private static final long serialVersionUID = 1L;

    @ManyToOne
    @JoinColumn(name = "pid")
    private Project project;

    @Temporal(TemporalType.TIMESTAMP)
    private Date sttime;

    protected RequestId(){}

    public RequestId(Project project, Date sttime) {
        this.project = project;
        this.sttime = sttime;
    }

    public Project getProject() {
        return project;
    }

    public void setProject(Project project) {
        this.project = project;
    }

    public Date getSttime() {
        return sttime;
    }

    public void setSttime(Date sttime) {
        this.sttime = sttime;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;

        RequestId requestId = (RequestId) o;

        if (project != null ? !project.equals(requestId.project) : requestId.project != null) return false;
        return sttime != null ? sttime.equals(requestId.sttime) : requestId.sttime == null;
    }

    @Override
    public int hashCode() {
        int result = project != null ? project.hashCode() : 0;
        result = 31 * result + (sttime != null ? sttime.hashCode() : 0);
        return result;
    }

//    @Override
//    public String toString() {
//        String timeUrl = "";
//        try {
//            timeUrl = URLEncoder.encode(sttime.toString(), "UTF-8");
//        } catch (UnsupportedEncodingException e) {
//            e.printStackTrace();
//        }
//
//        String url = "";
//        try {
//            url = URLEncoder.encode("/search/findRequestByRequestIdProjectAndRequestIdSttime?pid="+project.getPid()+"&sttime="+sttime, "UTF-8");
//        } catch (UnsupportedEncodingException e) {
//            e.printStackTrace();
//        }
//
//        return "/search/findRequestByRequestIdProjectPidAndRequestIdSttime?pid="+project.getPid()+"&sttime="+timeUrl;
////        return url;
//    }

    @Override
    public String toString() {
        return "/RequestId{" +
                "project=" + project.getPid() +
                ", sttime=" + sttime.toString() +
                '}';
    }
}
import javax.persistence.*;

@Entity
public class Pledge {

    @EmbeddedId
    private PledgeId pledgeId;
    @ManyToOne
    @JoinColumn(name = "credit_card")
    private CreditCard credit_card;
    private int amount;

    ...
    constructors
    getter & setters
    ...
}
import javax.persistence.*;
import java.io.Serializable;
import java.util.Date;

@Embeddable
public class PledgeId implements Serializable {

    private static final long serialVersionUID = 1L;

    @MapsId("requestId")
    @ManyToOne
    @JoinColumns({
            @JoinColumn(name = "pid"),
            @JoinColumn(name = "sttime")
    })
    private Request request;

    @ManyToOne
    @JoinColumn(name = "uemail")
    private Customer customer;

    @Temporal(TemporalType.TIMESTAMP)
    private Date pledgetime;    

    ...
    constructors
    getter & setters
    equals & hashcode
    toString
    ...
}