แบบสอบถาม JPQL พร้อมการรวมด้านซ้าย

ฉันกำลังพยายามสร้างแบบสอบถาม JPQL ที่จะรวมสองตารางเข้าด้วยกันและฉันสามารถตั้งค่าข้อมูลในนั้นได้

public void uploadSaveGame(User user, String saveData)
    {
        EntityTransaction entr=em.getTransaction();
        entr.begin();

        try{
             Query query = em.createQuery("UPDATE Saves s SET s.save = :saveData" +
"WHERE s.login = :user in (select sa.saveid,sa.Users.login, sa.savedata from Saves sa  "
                 + "LEFT JOIN sa.Users m WHERE sa.saves = m.users.saveid)", Save.class);
        query.setParameter("login", user);
        query.setParameter("saveData", saveData);
        query.executeUpdate(); 
        entr.commit();

        }catch(Exception e){
          entr.rollback();
        }

    }

ฉันมีเอนทิตีนี้:

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package com.dke.ps.Tables;

import java.io.Serializable;
import java.util.Collection;
import javax.persistence.Basic;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlTransient;

/**
 *
 * @author michal
 */
@Entity
@Table(name = "saves")
@XmlRootElement
@NamedQueries({
    @NamedQuery(name = "Saves.findAll", query = "SELECT s FROM Saves s")
    , @NamedQuery(name = "Saves.findBySaveid", query = "SELECT s FROM Saves s WHERE s.saveid = :saveid")
    , @NamedQuery(name = "Saves.findBySavedata", query = "SELECT s FROM Saves s WHERE s.savedata = :savedata")})
public class Saves implements Serializable {

    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Basic(optional = false)
    @Column(name = "saveid")
    private Integer saveid;
    @Column(name = "savedata")
    private String savedata;
    @JoinColumn(name = "userid", referencedColumnName = "userid")
    @ManyToOne(optional = false)
    private Users userid;
    @OneToMany(mappedBy = "saveid")
    private Collection<Users> usersCollection;

    public Saves() {
    }

    public Saves(Integer saveid) {
        this.saveid = saveid;
    }

    public Integer getSaveid() {
        return saveid;
    }

    public void setSaveid(Integer saveid) {
        this.saveid = saveid;
    }

    public String getSavedata() {
        return savedata;
    }

    public void setSavedata(String savedata) {
        this.savedata = savedata;
    }

    public Users getUserid() {
        return userid;
    }

    public void setUserid(Users userid) {
        this.userid = userid;
    }

    @XmlTransient
    public Collection<Users> getUsersCollection() {
        return usersCollection;
    }

    public void setUsersCollection(Collection<Users> usersCollection) {
        this.usersCollection = usersCollection;
    }

    @Override
    public int hashCode() {
        int hash = 0;
        hash += (saveid != null ? saveid.hashCode() : 0);
        return hash;
    }

    @Override
    public boolean equals(Object object) {
        // TODO: Warning - this method won't work in the case the id fields are not set
        if (!(object instanceof Saves)) {
            return false;
        }
        Saves other = (Saves) object;
        if ((this.saveid == null && other.saveid != null) || (this.saveid != null && !this.saveid.equals(other.saveid))) {
            return false;
        }
        return true;
    }

    @Override
    public String toString() {
        return "com.dke.ps.Tables.Saves[ saveid=" + saveid + " ]";
    }

}

และคลาสผู้ใช้:

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package com.dke.ps.Tables;

import java.io.Serializable;
import java.util.Collection;
import java.util.Date;
import javax.persistence.Basic;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlTransient;

/**
 *
 * @author michal
 */
@Entity
@Table(name = "users")
@XmlRootElement
@NamedQueries({
    @NamedQuery(name = "Users.findAll", query = "SELECT u FROM Users u")
    , @NamedQuery(name = "Users.findByUserid", query = "SELECT u FROM Users u WHERE u.userid = :userid")
    , @NamedQuery(name = "Users.findByLogin", query = "SELECT u FROM Users u WHERE u.login = :login")
    , @NamedQuery(name = "Users.findByPassword", query = "SELECT u FROM Users u WHERE u.password = :password")
    , @NamedQuery(name = "Users.findByEmail", query = "SELECT u FROM Users u WHERE u.email = :email")
    , @NamedQuery(name = "Users.findByDate", query = "SELECT u FROM Users u WHERE u.date = :date")})
public class Users implements Serializable {

    private static final long serialVersionUID = 1L;
    @Id
    @Basic(optional = false)
    @Column(name = "userid")
    private Integer userid;
    @Column(name = "login")
    private String login;
    @Column(name = "password")
    private String password;
    @Column(name = "email")
    private String email;
    @Column(name = "date")
    @Temporal(TemporalType.DATE)
    private Date date;
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "userid")
    private Collection<Saves> savesCollection;
    @JoinColumn(name = "saveid", referencedColumnName = "saveid")
    @ManyToOne
    private Saves saveid;

    public Users() {
    }

    public Users(Integer userid) {
        this.userid = userid;
    }

    public Integer getUserid() {
        return userid;
    }

    public void setUserid(Integer userid) {
        this.userid = userid;
    }

    public String getLogin() {
        return login;
    }

    public void setLogin(String login) {
        this.login = login;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public Date getDate() {
        return date;
    }

    public void setDate(Date date) {
        this.date = date;
    }

    @XmlTransient
    public Collection<Saves> getSavesCollection() {
        return savesCollection;
    }

    public void setSavesCollection(Collection<Saves> savesCollection) {
        this.savesCollection = savesCollection;
    }

    public Saves getSaveid() {
        return saveid;
    }

    public void setSaveid(Saves saveid) {
        this.saveid = saveid;
    }

    @Override
    public int hashCode() {
        int hash = 0;
        hash += (userid != null ? userid.hashCode() : 0);
        return hash;
    }

    @Override
    public boolean equals(Object object) {
        // TODO: Warning - this method won't work in the case the id fields are not set
        if (!(object instanceof Users)) {
            return false;
        }
        Users other = (Users) object;
        if ((this.userid == null && other.userid != null) || (this.userid != null && !this.userid.equals(other.userid))) {
            return false;
        }
        return true;
    }

    @Override
    public String toString() {
        return "com.dke.ps.Tables.Users[ userid=" + userid + " ]";
    }

}

คลาสทั้งสองนี้ถูกสร้างขึ้นโดยอัตโนมัติโดยการเชื่อมต่อฐานข้อมูล ดังนั้นในแบบสอบถามนั้น ฉันคิดว่าฉันควรทำงานร่วมกับพวกเขา ไม่ใช่ทำงานกับตารางในฐานข้อมูลโดยตรง เป็นอย่างนั้นเหรอ?

ขออภัย ฉันไม่ได้แก้ไขข้อมูลคอลัมน์ใดๆ และฉันไม่รู้ว่าปัญหาอยู่ที่ไหน

เอนทิตีผู้ใช้ของฉันมีความสัมพันธ์แบบหลายต่อมากกับเอนทิตีบันทึก


person Aaka    schedule 30.05.2017    source แหล่งที่มา
comment
การสืบค้นเรียงลำดับถูกต้องหรือไม่ ทำไมคุณไม่ลองดูล่ะ   -  person Scary Wombat    schedule 30.05.2017
comment
ไม่ แบบสอบถามไม่ได้เรียงลำดับที่ถูกต้อง :) ฉันเขียนได้ไม่ดี   -  person Aaka    schedule 30.05.2017
comment
โปรดเพิ่มตัวบันทึกหรืออย่างน้อยก็ระบบในข้อยกเว้น แทนที่จะย้อนกลับเฉพาะธุรกรรม... ฉันสงสัยว่ามีข้อยกเว้นแบบเงียบๆ เกิดขึ้น   -  person Zeromus    schedule 30.05.2017


คำตอบ (1)


หากคุณพิมพ์ข้อยกเว้น คุณอาจสังเกตเห็นว่าคุณมีพารามิเตอร์ :user แต่คุณกำลังพยายามตั้งค่าพารามิเตอร์การเข้าสู่ระบบแทน

query.setParameter("login", user);
person Zeromus    schedule 30.05.2017