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

时间:2016-06-09 15:35:14

标签: jpa db2 spring-data-jpa

我有一个spring data jpa存储库。我想查询数据库视图。 该数据库是DB2,它支持一个名为“全局变量”的功能,它实际上是一个会话变量。 db视图声明使用全局变量。

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

这样的事情会起作用吗?

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

有没有替代解决方案?

4 个答案:

答案 0 :(得分:1)

这就是我想在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 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();
}

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

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

您不能像示例中那样将两个语句放在一起,但是您应该能够创建两个不同的Query并分别在分别调用executeUpdate()getResultList()时执行它们。 (我对JPA不太熟悉,我可能使用了错误的方法名称,希望你能得到这个想法。)

答案 3 :(得分:0)

您可以尝试CRUD方法:

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