DB2“With UR”Spring Data JPA

093gszye  于 2023-09-29  发布在  Spring
关注(0)|答案(1)|浏览(215)

我正在使用Spring Data Repository接口从DB2(z/OS)检索数据。我有两个依赖于方法签名的方法,还有一个依赖于显式的@Query。
如何使生成的SQL具有“WITH UR”子句?我在@Query注解上面的行和两个方法上面添加了@Transactional(isolation=Isolation.READ_UNCOMMITTED),但它似乎没有将子句附加到生成的SQL。
谢谢

6kkfgxo0

6kkfgxo01#

我发现在逐个查询的基础上实现这一点的唯一方法是通过使用Hibernate注解提示和自定义方言。
Sping 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);

自定义方言类应该从DB2390 Dialect扩展而来,下面提供了一个简单的实现(没有经过全面测试)。

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);
        }
    }
}

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

相关问题