当前位置: 首页 > 知识库问答 >
问题:

多行的Spring data jpa更新不起作用

呼延凌
2023-03-14

前一段时间,我的查询对于单行更新很有效。现在我必须修改这个查询来更新多行。查询是本机的,使用postgresql和postgis。

老问题是:

@Modifying
@Transactional
@Query(value = "WITH tmp AS (SELECT ST_Difference( (SELECT ST_Buffer(ST_Union(ST_Buffer(a.area\\:\\:geometry, 0.002)), -0.002) \n" + 
        "   FROM mydb.city_area a, mydb.dis_city d, mydb.city c \n" + 
        "   where c.id_city=d.id_city and d.id_dis=?1  \n" + 
        "   and c.cod_city=a.cod_city), \n" + 
        "                     (ST_Difference( ST_GeomFromGeoJSON(?2)\\:\\:geometry, (SELECT ST_Union(a.area\\:\\:geometry) \n" + 
        "   FROM mydb.city_area a, mydb.dis_city d, mydb.city c \n" + 
        "   where c.id_city=d.id_city and d.id_dis=?1  \n" + 
        "   and c.cod_city=a.cod_city and c.full_area=true)                          \n" + 
        "                       ))                                      \n" + 
        "                   ) AS final_area)\n" + 
        "UPDATE mydb.dis_area SET new_area=(SELECT final_area FROM tmp), " +
        "id_type=3 " +
        "WHERE id_dis=?1 ",
        nativeQuery = true)
Integer insertShape(Integer id, String shapeGeoJson);

在新的查询中,我在@Modifying中添加了一些参数,如下所述:

@Modifying(flushAutomatically = true, clearAutomatically = true)
@Transactional
@Query(value = "WITH tmp AS (SELECT ST_Difference( (SELECT ST_Buffer(ST_Union(ST_Buffer(a.area\\:\\:geometry, 0.002)), -0.002) \n" + 
        "   FROM mydb.city_area a, mydb.dis_city d, mydb.city c \n" + 
        "   where c.id_city=d.id_city and d.id_dis=?1  \n" + 
        "   and c.cod_city=a.cod_city), \n" + 
        "                     (ST_Difference( ST_GeomFromGeoJSON(?2)\\:\\:geometry, (SELECT ST_Union(a.area\\:\\:geometry) \n" + 
        "   FROM mydb.city_area a, mydb.dis_city d, mydb.city c \n" + 
        "   where c.id_city=d.id_city and d.id_dis=?1  \n" + 
        "   and c.cod_city=a.cod_city and c.full_area=true)                          \n" + 
        "                       ))                                      \n" + 
        "                   ) AS final_area)\n" + 
        "UPDATE mydb.dis_area SET new_area=(SELECT final_area FROM tmp), " +
        "id_type=3 " +
        "WHERE id_dis_aree=(select id_dis_aree from dis_area where id_dis=?1) ",
        nativeQuery = true)
Integer insertShape(Integer id, String shapeGeoJson);

但可悲的是,这种改变没有任何效果。(如果我午餐从postgresql查询它运行完美)。我该怎么解决?

编辑:我添加了查询,但它适用于postgresql。唯一的区别是旧版本:WHEREid_dis=?1目标是一行,新的WHEREid_dis_aree=(选择id_dis_areedis_areaid_dis=?1)以多行为目标。id_dis_aree和id_dis是主键。两个或多个记录可能具有相同的id_dis_aree和不同的id_dis。因此,对于第二个查询,我从id_dis获取id_dis_aree,以影响更多的行。

编辑2:我做了2个测试:

>

  • 将最后一个子选择直接替换为固定的有线id值:其中id_dis_aree=123456,以这种方式工作。这可能是一种解决方法,在调用查询后获取id\u dis\u aree

    将最后一个子选择替换为:WHEREid_dis_areeIN(选择id_dis_aree从dis_areaid_dis=?1)不起作用。(备忘录:子选择总是返回一个值)。

  • 共有1个答案

    仲孙文乐
    2023-03-14

    我没有找到真正的解决方案,只是一个变通方法:

    @Transactional
    public Integer insertDis(Integer idDis, String shapeGeoJson) {
        return disAreeRepository.
                insertShape(
                        idDis,
                        shapeGeoJson,
                        disAreeRepository.findByIdIdDis(idDis).getId().getIdDisAree() 
                        );
    }
    

    然后将其作为第三个参数传递给@Repository本机查询:

    @Modifying(flushAutomatically = true, clearAutomatically = true)
    @Query(value = "WITH tmp AS (SELECT ST_Difference( (SELECT ST_Buffer(ST_Union(ST_Buffer(a.area\\:\\:geometry, 0.002)), -0.002) \n" + 
            "   FROM mydb.city_area a, mydb.dis_city d, mydb.city c \n" + 
            "   where c.id_city=d.id_city and d.id_dis=?1  \n" + 
            "   and c.cod_city=a.cod_city), \n" + 
            "                     (ST_Difference( ST_GeomFromGeoJSON(?2)\\:\\:geometry, (SELECT ST_Union(a.area\\:\\:geometry) \n" + 
            "   FROM mydb.city_area a, mydb.dis_city d, mydb.city c \n" + 
            "   where c.id_city=d.id_city and d.id_dis=?1  \n" + 
            "   and c.cod_city=a.cod_city and c.full_area=true)                          \n" + 
            "                       ))                                      \n" + 
            "                   ) AS final_area)\n" + 
            "UPDATE mydb.dis_area SET new_area=(SELECT final_area FROM tmp), " +
            "id_type=3 " +
            "WHERE id_dis_aree=?3 ",
            nativeQuery = true)
    Integer insertShape(Integer id, String shapeGeoJson, Integer idDisAree);
    
     类似资料:
    • 我有一个表格形式(显示4条记录)和一个数据块(基于视图)。 查询后,表单无法更新所有记录,但只有第一个记录值可以从LOV中选择。 我在插入和更新时调用了一个过程。 查询是这样的: 是否查看表,或者我应该使用其他触发器或循环? 请有人可以建议我如何编辑此查询以进行多次更新吗? 谢啦 星期六33

    • 我有一个简单的存储过程,在我创建的表上执行。当我使用硬编码参数单独执行update语句时,它可以工作,但过程在执行时不会更新。它返回一个“命令已成功完成”,但不影响任何行。我检查了数据,数据也没有变化。

    • 我最近从我的windows机器换成了iMac,我把我的angular项目复制到Mac上,并按照所有的安装说明操作,但现在当我键入NPM start时,项目开始了,但当我保存文件时并没有更新。 我已经卸载了angular-cli并将其安装到最新版本 角度-CLI:1 . 0 . 0-β21 节点:6.9.1 操作系统:达尔文x64 我也安装了守夜人,但没有成功。 我杀ng服的时候,网站直接给出错误

    • 问题内容: 我有一个非常简单的设置,可以尝试使用注释进行双向映射: 和 当我设置属性TypeA.bs时,虽然应该,但它不会影响映射。请参见以下示例: 如果映射是双向的,则应填充集合,并且应更新b的属性a,但不是。有任何想法吗? 编辑 感谢您的帮助,现在我明白了! 问题答案: 对于一致的域模型,应始终设置关系的两端,如下所示: 当您的实体处于不一致状态时,JPA将始终根据JPA关系拥有方的对象状态存

    • 问题内容: INSERT INTO EMP_1 (EMP_NUM, EMP_LNAME, EMP_FNAME, EMP_INITIAL, EMP_HIREDATE, JOB_CODE) VALUES (‘101’, ‘News’, ‘John’, ‘G’, ‘08-Nov-00’, ‘502’), (‘102’, ‘Senior’, ‘David’, ‘H’, ‘12-Jul-89’, ‘501’

    • 问题内容: 我已经阅读了一些有关我的问题的信息,但仍然没有得到正确的答案。我尝试了.on()方法仍然无法正常工作。我正在使用Laravel。 JS 加载页面后,我想要的所有东西都可以正常工作,但是当我使用replaceWith()方法更新元素,然后onclick无法正常工作时。 我检查了更新的html和属性,所有这些都在正确的位置。 问题答案: 您需要使用事件委托:- 因此更改::- 至::- 所