gpt4 book ai didi

java - 在纯 JPA @Query 中传递 Enum 值有哪些方法?

转载 作者:行者123 更新时间:2023-12-02 01:53:06 41 4
gpt4 key购买 nike

假设我想将记录的列值设置为“已解决”。但是,我想从枚举中获取这个值。因此,无论是否有人决定将“已解决”更改为“已解决”或类似的内容,查询都保持不变。换句话说,开发人员不需要使用新的 Enum 值编辑 JPA 查询。只是想知道有什么方法可以解决这个问题,或者 JPA 是否不允许这样做。我知道查询是静态的,但之前我能够在查询中传递一个对象来在其中存储查询结果字段。所以我想知道是否也可以对枚举做同样的事情。

这是我当前的策略:将“RESOLVE”作为@Param“状态”传递。但是,我仍然想知道如何传递枚举,因为这感觉比回答问题本身更像是一种解决方法。

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 (也可以从接口(interface)签名推断)。

仅供引用,如果 where 子句中的任何字段都不是键,并且设置了 SQL_SAFE_UPDATES 选项,则 SQL 工作台可能会拒绝您的查询。这是因为如果不在 where 子句中指定键(例如主键),则无法更新或删除记录。

最佳答案

这是不可能的,因为注释属性值必须是常量,而 Enum 不是常量。但是你可以使用java8接口(interface)默认方法作为解决这个问题的技巧。模板代码:

public interface TheEntityJpaRepository extends JpaRepository<TheEntity, Long> {
@Modifying(clearAutomatically = true)
@Query("UPDATE TheEntity SET status = :status WHERE id = :value")
int markToStatus(@Param("value") Long value, @Param("status") TheStatusEnum status);

default int markAsResolved(Long value) {
return markToStatus(value, TheStatusEnum.RESOLVED);
}
}

@Entity
public class YourEntity {
...
@Enumerated(EnumType.STRING)
private Status status;
...
}

public enum TheStatusEnum {
RESOLVED,
...
}

但是你应该知道,这种方式会暴露 markToStatus 方法。

关于java - 在纯 JPA @Query 中传递 Enum 值有哪些方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52697379/

41 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com