如何从 spring 数据 jpa 上下文在会话上设置 DB2 全局变量

How to set DB2 global variable on session from spring data jpa context

我有一个 spring 数据 jpa 存储库。我想查询数据库视图。 数据库是 DB2,支持一个名为 'global variable' 的特性,它实际上是一个会话变量。数据库视图声明使用全局变量。

如何在执行视图之前在运行时设置此变量的值?

这样的东西行得通吗?

public interface DomainRepository extends org.springframework.data.jpa.repository.JpaRepository<Domain, IdType> {
      @Query(value = "SET SCHEMA.VAR_GLOBAL = :param; SELECT * FROM SCHEMA.DOMAIN", nativeQuery = true)
      List<Domain> findByDomain(@Param("param") String param);
         }

是否有其他解决方案?

变量声明不适用于 JDBC 但临时表可以:

DECLARE GLOBAL TEMPORARY TABLE SESSION.myvars
(
VAR_GLOBAL VARCHAR(255)
) ON COMMIT PRESERVE ROWS;

您不能像示例中那样将两个语句混为一谈,但您应该能够创建两个不同的 Query 并分别在对 executeUpdate()getResultList() 的单独调用中执行它们. (我对 JPA 不是很熟悉,我可能使用了错误的方法名称,希望你能理解。)

您可以尝试CRUD方法:

public interface DomainRepository extends CrudRepository<Domain, Long>{
    List<Domain> findAll();
}

这就是我想在 SQL 中实现的目标:

SET CURRENT APPLICATION COMPATIBILITY = 'V11R1';
SET SCHEMA.VAR_GL = 'Value';
SELECT * FROM SCHEMA.VIEW;

SCHEMA.VIEW 声明为:

SELECT * FROM SCHEMA.TABLE WHERE field = VAR_GL

我必须用@Transactional 注释在控制器上标记 public 方法,以便在一个数据库会话中一起执行查询。

public interface Controller {  
  @Transactional
  List<Options> loadOptions();
}
public class ControllerImpl implements Controller {
  @Autowired
  private DomainRepository repo;
  @Override
  public List<Option> loadOptions() {
    this.repo.setCompatibilityMode();
    this.repo.setGlobalVariableA("Value");
    List<Option> list = this.repo.loadDropdown();
    return list;
  }

在我的 jpa 存储库中,每个全局变量都需要一个方法:

public interface DomainRepository extends JpaCrudRepository<Option, OptionPK> {
  @Modifying
  @Query(value = "SET CURRENT APPLICATION COMPATIBILITY = 'V11R1'", nativeQuery = true)
      void setCompatibilityMode();    
  }
  @Modifying
  @Query(value = "set SCHEMA.VAR_GL = :value", nativeQuery = true)
  void setGlobalVariableA(@Param("value") String value);
  @Query(value = "SELECT * FROM SCHEMA.VIEW", nativeQuery = true)
  List<Option> loadDropdown();
}

这就是它的工作原理。我想进一步改进这个解决方案,但我不知道如何通过将变量名称作为参数来使变量查询更具可重用性。