我有这个 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/