我正在使用Spring Data Repository接口从DB2(z/OS)检索数据。我有两个依赖于方法签名的方法,还有一个依赖于显式的@Query。如何使生成的SQL具有“WITH UR”子句?我在@Query注解上面的行和两个方法上面添加了@Transactional(isolation=Isolation.READ_UNCOMMITTED),但它似乎没有将子句附加到生成的SQL。谢谢
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 方法就足够了。
1条答案
按热度按时间6kkfgxo01#
我发现在逐个查询的基础上实现这一点的唯一方法是通过使用Hibernate注解提示和自定义方言。
Sping Boot 2.7和spring-data-jpa 2.7.12
在Repository接口中,在Repository方法上方使用@QueryHints和@QueryHint注解。
自定义方言类应该从DB2390 Dialect扩展而来,下面提供了一个简单的实现(没有经过全面测试)。
如果不需要逐个检查查询,那么从DB2390 Dialect扩展的自定义Dialect覆盖Dialect类的 transformSelectString 方法就足够了。