DB2"With UR"Spring Data JPA

Chu*_*ton 6 spring isolation-level spring-data

我正在使用Spring Data Repository接口从DB2(z/OS)检索数据.我有几个依赖方法signatues的方法和一个依赖于显式@Query的方法.

如何使生成的SQL具有"WITH UR"子句?我在@Query注释上方的行上添加了@Transactional(isolation = Isolation.READ_UNCOMMITTED),并且在两个方法之上,但它似乎没有将子句附加到生成的SQL.

谢谢

HFS*_*Dev 0

我发现在逐个查询的基础上执行此操作的唯一方法是通过使用 Hibernate 注释提示和自定义方言。

我正在使用 Spring Boot 2.7 和 spring-data-jpa 2.7.12。

在您的 Repository 界面中,在 Repository 方法上方使用@QueryHints和 @QueryHint 注释。

@QueryHints(value = {
        @QueryHint(name=org.hibernate.jpa.QueryHints.HINT_COMMENT, value=DB2zOSCustomDialect.UNCOMMITTED_READ)})
Optional<MyEntity> findByProperty(String property);
Run Code Online (Sandbox Code Playgroud)

自定义方言类应该从 DB2390Dialect 扩展,下面提供了一个直接的实现(未经过彻底测试)。

public class DB2zOSCustomDialect extends DB2390Dialect{

    Logger logger = LoggerFactory.getLogger(getClass());
    public static final String UNCOMMITTED_READ = "with ur";
    
    @Override 
    public String addSqlHintOrComment(java.lang.String sql, QueryParameters parameters, boolean commentsEnabled){
        String uncommittedRead = parameters.getComment();
    
        if(uncommittedRead != null && uncommittedRead.equalsIgnoreCase(UNCOMMITTED_READ)) {
            parameters.setComment(null);
            return super.addSqlHintOrComment(sql, parameters, commentsEnabled) + " " + UNCOMMITTED_READ;
        } else {
            return super.addSqlHintOrComment(sql, parameters, commentsEnabled);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

如果您不需要逐个检查查询,则从 DB2390Dialect 扩展的自定义 Dialect 覆盖Dialect类中的transformSelectString方法就足够了。