java - Spring hibernate @param 将映射到什么

标签 java spring hibernate

我有这个 Pojo 作为我的 hibernate 实体,我正在尝试使用 hibernate 来更新表中的一些行:

@Entity
public class Money {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id", unique = true, updatable = false, nullable = false)
    private Long id;

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

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

    @Column(name = "money")
    private double money;

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

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


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

    @Column(name = "created_at")
    @CreationTimestamp
    private Date createdAt;

    @Column(name = "updated_at")
    private Date updated_at;

    public Long getId() {
        return id;
    }

    public String getUserid() {
        return userid;
    }

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

    public String getEmail() {
        return email;
    }

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

    public double getMoney() {
        return money;
    }

    public void setMoney(double money) {
        this.money = money;
    }

    public String getStatus() {
        return status;
    }

    public void setStatus(String status) {
        this.status = status;
    }    

    public Date getCreatedAt() {
        return createdAt;
    }

    public void setCreatedAt(Date createdAt) {
        this.createdAt = createdAt;
    }

    public Date getUpdated_at() {
        return updated_at;
    }

    public void setUpdated_at(Date updated_at) {
        this.updated_at = updated_at;
    }

}

我想做的是:

@Repository
public interface MoneyRepository extends CrudRepository<Winners, Long> {

    List<Winners> findAll();

    List<Winners> findByUseridAndStatus(String userid, String status);

    @Modifying(clearAutomatically = true)
    @Transactional
    @Query(value = "UPDATE Money w SET w.status = :status WHERE id in :ids")
    int testUpdate(@Param("status") String status, @Param("id") List<Long> ids);
}

在我的 Controller /服务中,我使用它的方式如下:

@Autowired
PayoutRepository payoutRepository;

public int testUpdateDB() {

    List<Long> pendingIds = Arrays.asList(1l, 2l);

    int affected = payoutRepository.testUpdate("pending", pendingIds);

        return affected;
    }

如果我不使用@Param("id") List<Long> ids它在提示

java.lang.IllegalStateException: For queries with named parameters you need to use provide names for method parameters. Use @Param for query method parameters, or when on Java 8+ use the javac flag -parameters.

如果我使用@Param("id") List<Long> ids它在提示:

org.hibernate.QueryException: Named parameter [ids] not set

如果将我的查询更改为 @Query(value = "UPDATE Money w SET w.status = :status WHERE id in :id")无需更改任何其他内容(只需将 :ids 更改为 :id)即可工作。有人可以解释一下该映射是如何工作的吗?

最佳答案

@Param("id") 告诉他查询中参数的名称

所以如果您的查询是“UPDATE Money w SET w.status = :status WHERE id in :ids”<,那么它应该是@Param("ids")/p>

If I don't use  @Param("id") List<Long> ids it's complaining about

java.lang.IllegalStateException: For queries with named parameters you need to use provide names for method parameters. Use @Param for query method parameters, or when on Java 8+ use the javac flag -parameters.

这是因为你的所有参数都需要有一个@param来告诉他将哪些参数映射到哪里。

If I use @Param("id") List<Long> ids it's complaining :

org.hibernate.QueryException: Named parameter [ids] not set

这是因为现在您有了 @param 注释,因此它会继续执行,然后在您的查询中找不到任何名为 id :id 的参数 @Query

@Param注释中的名称应该映射查询中参数的名称,名称位于:之后

关于java - Spring hibernate @param 将映射到什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49760652/

相关文章:

java - 即使故意使用不正确的 keystore 密码,APK 也会构建

java - 安装apache-maven-3.5.4-bin.zip(无法正确设置文件路径)

java - 如何获取@UniqueConstraint列名

java - Hibernate 查询返回陈旧数据

java - Selenium - 滚动到嵌套滚动条内的 View 元素

java正则表达式匹配任何字符串,特定字符串,任何字符串,特定字符串和任何字符串

spring - FAIL - 上下文路径/icescrum 中的应用程序无法启动

java - 动态切换数据源

spring - 注入(inject)和资源以及 Autowiring 注释

java - 在 MYSQL 数据库中存储 base64 字符串的最佳方法是什么?