【发布时间】:2019-03-12 20:04:01
【问题描述】:
假设我想将记录的列值设置为“已解决”。但是,我希望从枚举中获取此值。因此,无论有人决定将“RESOLVED”更改为“RESOLVE”或类似的东西,查询都保持不变。换句话说,开发人员不需要使用新的 Enum 值编辑 JPA 查询。只是想知道有哪些方法可以解决,或者 JPA 是否不允许这样做。我知道查询是静态的,但早些时候我能够在查询中传递一个对象以将查询结果字段存储在其中。所以我想知道是否也可以对 Enums 做同样的事情。
这是我目前的策略:将“RESOLVE”作为@Param“状态”传递。但是,我仍然想知道如何传递 Enums,因为这感觉更像是一种解决方法,而不是回答问题本身。
public interface UpdateStatusStandardDAO extends JpaRepository<DBTableName, Long>
{
@Transactional
@Modifying(clearAutomatically = true)
@Query("UPDATE"
+ " TableName tn"
+ " SET"
+ " tn.status =:status"
+ " WHERE"
+ " tn.field1 =:field1"
+ " AND tn.field2 =:field2"
+ " AND tn.field3 =:field3")
int updateStatus(@Param("status") String status, @Param("field1") Long field1,
@Param("field2") String field2, @Param("field3") String field3);
}
我知道的: 1. @Transactional:用于更新/删除操作。否则,我得到 org.springframework.dao.InvalidDataAccessApiUsageException。 2.@Modifying(clearAutomatically = true):因为实体管理器默认不会自动刷新变化。
为简单起见,我们将 field1 视为主键。它的类型是 Long(也可以从接口签名中推断出来)。
对于纯粹的参考,如果 where 子句中的任何字段都不是键,那么如果设置了 SQL_SAFE_UPDATES 选项,则 SQL 工作台可能会拒绝您的查询。那是因为如果不在 where 子句中指定键(例如,主键),您将无法更新或删除记录。
【问题讨论】:
-
JPA 允许传入枚举作为参数,是的。您正在使用不是 JPA API 的“Spring Data JPA”(
@Query与 JPA API 无关)。您不发布您的实体,因此没有人知道例如“id”是什么类型。发布完整信息。一些 JDBC 驱动程序可能不允许在 UPDATE 子句中指定参数,但是在您实际发布尝试时发生的情况之前,没有太多要说的 -
在此处发布您的实体类和枚举。
-
这看起来不错,你有什么例外吗?
-
@SudhirOjha 将实体类和枚举放在这里。
-
@maslan 请参考问题更新,让我知道您的想法。
标签: java spring jpa enums spring-data-jpa