【问题标题】:JPA @Query annotation for update query (oracle sql developer) -- org.hibernate.exception.GenericJDBCException: could not execute query用于更新查询的 JPA @Query 注解(oracle sql developer)——org.hibernate.exception.GenericJDBCException:无法执行查询
【发布时间】:2019-03-04 11:10:55
【问题描述】:

我有一个存储库文件共享相同的源代码和一个控制器类,我通过该控制器类调用该@query 函数以获取更新语句。我想将一列数据更新到我的 Oracle 数据库中,为此我编写了 JPA update @query 并将函数定义到一个存储库文件中,因此从我的一个控制器类调用无法执行查询。

存储库文件

package com.sid.demo.repository;

import java.util.List;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import com.sid.demo.model.hindalco_model;

public interface update_password extends JpaRepository<hindalco_model,Integer> 
{   
    @Query(value="update USER_REGISTRATION set password = :password WHERE user_name = :user_name and email = :email",nativeQuery=true)
    List<String> findbyuser_update(@Param("password") String password,String user_name,String email);   
}

控制器类

@RequestMapping(value="/update_password",method = RequestMethod.POST)
    public String update_password(@RequestParam String password)
    {
        //String rnumber_verified=randomNumber;
        //int random_otp_verified=Integer.parseInt(rnumber_verified);



        //System.out.println("update query string value = "+hindalco_user_login12);
        System.out.println("user_name outside try = "+user_name12);
        System.out.println("email outside try = "+password12);
        try
        {
            System.out.println("user_inside try = "+user_name12);
            System.out.println("email inside try = "+password12);

            update_password_repo.findbyuser_update(password,user_name12,password12);
            return "Entered password successfully updated"; 
        }
        catch(Exception e)
        {
            return"Iam sorry entered password did not match "+e;
        }

    }

模型类

package com.sid.demo.model;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;


@Entity
@Table(name="user_registration")
public class hindalco_model
{
    @GeneratedValue(strategy=GenerationType.AUTO)
    @Id
    @Column(name="user_id")
    private int user_id;

    @Column(name="user_name")
    private String user_name;

    @Column(name="email")
    private String email;

    @Column(name="password")
    private String password;

    public int getUser_id() {
        return user_id;
    }

    public void setUser_id(int user_id) {
        this.user_id = user_id;
    }

    public String getUser_name() {
        return user_name;
    }

    public void setUser_name(String user_name) {
        this.user_name = user_name;
    }

    public String getEmail() {
        return email;
    }

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

    public String getPassword() {
        return password;
    }

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



    @Override
    public String toString() {
        return "hindalco_model [user_id=" + user_id + ", user_name=" + user_name + ", email=" + email + ", password="
                + password +"]";
    }



}

我只是想编写 JPA @query 来更新我的列数据之一,为此,我想将函数调用从控制器类传递到包含 @query 注释函数定义的存储库文件,该函数定义将自动转换为休眠查询通过编译器,因此在 oracle 数据库中数据将被更新。

【问题讨论】:

    标签: java hibernate spring-boot spring-data-jpa


    【解决方案1】:
    @Transactional
    @Modifying(clearAutomatically = true)
    @Query(value="update USER_REGISTRATION set password = ?1 WHERE user_name = ?2 and email = ?3",nativeQuery=true)
    void findbyuser_update(String password,String user_name,String email);   
    

    @Modifying 注解用于增强@Query 注解,不仅可以执行 SELECT 查询,还可以执行 INSERT、UPDATE、DELETE 甚至 DDL 查询。

    【讨论】:

    • 休眠:更新 DATABASE_NAME.USERS_TABLE SET PASSWORD = ?哪里用户名=? 2019-03-13 11:54:55.183 WARN 26760 --- [nio-8080-exec-6] o.h.engine.jdbc.spi.SqlExceptionHelper:SQL 错误:1002,SQLState:24000 2019-03-13 11:54: 55.183 错误 26760 --- [nio-8080-exec-6] o.h.engine.jdbc.spi.SqlExceptionHelper : ORA-01002: 无序获取
    • @SAMUELBARKLEY 您好,请分享您编写的更新查询
    • @Transactional @Modifying(clearAutomatically = true) @Query(value="UPDATE MINES.HMG_ZEPHYR_USERS SET PASSWORD = :password WHERE USER_NAME = :user_name",nativeQuery=true) List findbyuser_update(@ Param("password") String 密码,String user_name);
    • @SAMUELBARKLEY 更新查询不会返回 List 因此将其更改为 void 并重试,如果它确实有帮助,那么您可能需要将自动提交设置为 false
    【解决方案2】:

    对于修改查询(更新、删除、插入),您需要使用注解@Modifying

    此外,您的查询不会返回任何内容,因此您的方法可能应该返回 void

    虽然没有必要,但根据方法的实际操作来命名方法总是一个好主意。

    所有这些结果:

    @Modifying
    @Query(value="update USER_REGISTRATION set password = :password WHERE user_name = :user_name and email = :email",nativeQuery=true)
    void updatePassword(@Param("password") String password,String user_name,String email);   
    

    【讨论】:

    • 休眠:更新 ss.sid 设置密码 = ? WHERE USER_NAME = ? 2019-03-13 11:54:55.183 WARN 26760 --- [nio-8080-exec-6] o.h.engine.jdbc.spi.SqlExceptionHelper:SQL 错误:1002,SQLState:24000 2019-03-13 11:54: 55.183 错误 26760 --- [nio-8080-exec-6] o.h.engine.jdbc.spi.SqlExceptionHelper : ORA-01002: 无序获取
    【解决方案3】:

    通常流程类似于Controller -> Service -> Dao。所以你可以创建一个服务来调用各自的 dao/repository。另外,请查看 this 链接。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-03-31
      • 2017-07-22
      • 2013-05-24
      • 1970-01-01
      • 2012-06-14
      • 2018-07-13
      • 2013-06-20
      • 2017-07-28
      相关资源
      最近更新 更多