【问题标题】:Set work_mem for a native query in Spring data为 Spring 数据中的本机查询设置 work_mem
【发布时间】:2023-03-29 01:58:01
【问题描述】:

我需要为使用 Spring Data 存储库执行的本机查询设置 work_mem。

尝试使用如下本机查询

SET LOCAL WORK_MEM TO '8 MB';{Actual query} 

但这不起作用,因为 postgres 驱动程序正在拆分查询并将它们作为两个查询执行。由于第一个查询没有结果集,驱动程序抛出异常。

我正在寻找一种为此特定查询设置 work_mem 的方法

【问题讨论】:

    标签: hibernate spring-data-jpa spring-data


    【解决方案1】:

    您需要在调用实际查询之前触发 DDL 语句。

    确保使用额外的 @Modifying 注释来注释您的 DDL @Query。没有这个,引擎会期望一个结果集。

    使用@Modifying,您可以执行UPDATE, DELETE,在您的情况下也可以执行DDL 语句。

    确保将返回类型设置为 void

    【讨论】:

    • 感谢@Maciej Kowalski,我一直在寻找可以使用一种存储库方法完成所有操作的选项。但似乎你建议的选项是唯一的选择。
    【解决方案2】:

    可能晚了,但我一直在尝试让 Postgres 行级别安全性与我们的 JPA 项目一起工作,我使用以下内容设置本地会话变量。 '在我的机器上工作'。 (这只是一个概念证明 sn-p)

    @GetMapping(path = "/rlstest")
    @Transactional  // method must be annotated Transactional to tell JPA to use single session
    public List<?> testRls() {
        // use nativequery to set variable
        Query x = em.createNativeQuery("set local usr.permissions='group1'");
        x.executeUpdate();
    
        // back to normal JPA world.  Because the method is Transactional the variable will still be set
        Query q = em.createQuery("select t from Testrls t");
        return q.getResultList();
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-10
      • 2013-09-13
      • 2012-08-16
      • 1970-01-01
      • 2015-09-24
      • 2018-02-22
      相关资源
      最近更新 更多