2017-05-29 32 views
0

我有这样的代码:热点使用JPQL更新一些记录?

public void uploadSaveGame(User user, String saveData) 
{ 
    EntityTransaction entr=em.getTransaction(); 
     entr.begin(); 
    TypedQuery<Save> query = em.createQuery("UPDATE WithSave2 SET savedata WHERE u.login = :user", Save.class);    
    query.setParameter("login", user); 
    query.setParameter("save", saveData); 
    em.getTransaction().commit(); 
} 

而且我triyng更新列保存数据。这是我的班WitSave2:

/* 
* 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 javax.persistence.Column; 
import javax.persistence.Entity; 
import javax.persistence.Id; 
import javax.persistence.NamedQueries; 
import javax.persistence.NamedQuery; 
import javax.persistence.Table; 
import javax.xml.bind.annotation.XmlRootElement; 

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

    private static final long serialVersionUID = 1L; 
    @Column(name = "saveid") 
    @Id 
    private Integer saveid; 
    @Column(name = "login") 
    private String login; 
    @Column(name = "savedata") 
    private String savedata; 

    public WithSave2() { 
    } 

    public Integer getSaveid() { 
     return saveid; 
    } 

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

    public String getLogin() { 
     return login; 
    } 

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

    public String getSavedata() { 
     return savedata; 
    } 

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

} 

是否正确的查询来更新列?我不太确定,特别是这条线:

query.setParameter("login", user); 
     query.setParameter("save", saveData); 

有人可以帮我吗?非常感谢:)

+0

你要更新,但执行的是选择..你也开始交易,但不承诺.. –

+0

是的,这就是正确的:)我纠正它(在原来的职位)。如果我试图更新列,它说:异常说明:语法错误解析[更新WithSave2 SET savedata WHERE u.login =:user]。 [30,30]必须指定等号。 – Aaka

回答

1

你几件事情:

  • 你必须指定一个新值要更改的列(而不是更新的声明中另有)
  • 你必须运行查询..不仅可以定义它
  • 由于您正在使用手动事务,所以为了以防万一,您可以添加一些异常管理。
  • 执行批量更新时,您不需要TypedQuery

    EntityTransaction entr=em.getTransaction(); 
    entr.begin(); 
    
    try{ 
        Query query = em.createQuery("UPDATE WithSave2 
        SET savedata = :saveData WHERE u.login = :user", Save.class);    
        query.setParameter("login", user); 
        query.setParameter("save", saveData); 
    
        query.executeUpdate(); 
    
        entr.commit(); 
    }catch(Exception e){ 
        entr.rollback(); 
    } 
    
+0

感谢您的回答。 entr.commit();关闭连接? – Aaka