<tfoot id='RVbKX'></tfoot>

  1. <small id='RVbKX'></small><noframes id='RVbKX'>

    <legend id='RVbKX'><style id='RVbKX'><dir id='RVbKX'><q id='RVbKX'></q></dir></style></legend>
      <bdo id='RVbKX'></bdo><ul id='RVbKX'></ul>
  2. <i id='RVbKX'><tr id='RVbKX'><dt id='RVbKX'><q id='RVbKX'><span id='RVbKX'><b id='RVbKX'><form id='RVbKX'><ins id='RVbKX'></ins><ul id='RVbKX'></ul><sub id='RVbKX'></sub></form><legend id='RVbKX'></legend><bdo id='RVbKX'><pre id='RVbKX'><center id='RVbKX'></center></pre></bdo></b><th id='RVbKX'></th></span></q></dt></tr></i><div id='RVbKX'><tfoot id='RVbKX'></tfoot><dl id='RVbKX'><fieldset id='RVbKX'></fieldset></dl></div>

      Spring Data JPA Update @Query 没有更新?

      时间:2024-08-24
      <tfoot id='0p0MR'></tfoot>
        <bdo id='0p0MR'></bdo><ul id='0p0MR'></ul>
              <tbody id='0p0MR'></tbody>

              <i id='0p0MR'><tr id='0p0MR'><dt id='0p0MR'><q id='0p0MR'><span id='0p0MR'><b id='0p0MR'><form id='0p0MR'><ins id='0p0MR'></ins><ul id='0p0MR'></ul><sub id='0p0MR'></sub></form><legend id='0p0MR'></legend><bdo id='0p0MR'><pre id='0p0MR'><center id='0p0MR'></center></pre></bdo></b><th id='0p0MR'></th></span></q></dt></tr></i><div id='0p0MR'><tfoot id='0p0MR'></tfoot><dl id='0p0MR'><fieldset id='0p0MR'></fieldset></dl></div>

                <small id='0p0MR'></small><noframes id='0p0MR'>

                <legend id='0p0MR'><style id='0p0MR'><dir id='0p0MR'><q id='0p0MR'></q></dir></style></legend>

                本文介绍了Spring Data JPA Update @Query 没有更新?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着跟版网的小编来一起学习吧!

                问题描述

                我有一个更新查询:

                @Modifying
                @Transactional
                @Query("UPDATE Admin SET firstname = :firstname, lastname = :lastname, login = :login, superAdmin = :superAdmin, preferenceAdmin = :preferenceAdmin, address =  :address, zipCode = :zipCode, city = :city, country = :country, email = :email, profile = :profile, postLoginUrl = :postLoginUrl WHERE id = :id")
                public void update(@Param("firstname") String firstname, @Param("lastname") String lastname, @Param("login") String login, @Param("superAdmin") boolean superAdmin, @Param("preferenceAdmin") boolean preferenceAdmin, @Param("address") String address, @Param("zipCode") String zipCode, @Param("city") String city, @Param("country") String country, @Param("email") String email, @Param("profile") String profile, @Param("postLoginUrl") String postLoginUrl, @Param("id") Long id);
                

                我正在尝试在集成测试中使用它:

                I'm trying to use it in an integration test:

                adminRepository.update("Toto", "LeHeros", admin0.getLogin(), admin0.getSuperAdmin(), admin0.getPreferenceAdmin(), admin0.getAddress(), admin0.getZipCode(), admin0.getCity(), admin0.getCountry(), admin0.getEmail(), admin0.getProfile(), admin0.getPostLoginUrl(), admin0.getId());
                Admin loadedAdmin = adminRepository.findOne(admin0.getId());
                assertEquals("Toto", loadedAdmin.getFirstname());
                assertEquals("LeHeros", loadedAdmin.getLastname());
                

                但是这些字段没有更新并保留它们的初始值,因此测试失败.

                But the fields are not updated and retain their initial values, the test thus failing.

                我尝试在 findOne 查询之前添加一个刷新:

                I tried adding a flush right before the findOne query:

                adminRepository.flush();
                

                但失败的断言保持不变.

                But the failed assertion remained identical.

                在日志中可以看到更新sql语句:

                I can see the update sql statement in the log:

                update admin set firstname='Toto', lastname='LeHeros', login='stephane', super_admin=0, preference_admin=0,
                address=NULL, zip_code=NULL, city=NULL, country=NULL, email='stephane@thalasoft.com', profile=NULL,
                post_login_url=NULL where id=2839
                

                但日志显示没有可能与查找器相关的 sql:

                But the log shows no sql that could relate to the finder:

                Admin loadedAdmin = adminRepository.findOne(admin0.getId());
                The finder sql statement is not making its way to the database.
                

                是否因为某些缓存原因而被忽略?

                Is it ignored for some caching reason ?

                如果我随后添加对 findByEmail 和 findByLogin 查找器的调用,如下所示:

                If I then add a call to the findByEmail and findByLogin finders as in:

                adminRepository.update("Toto", "LeHeros", "qwerty", admin0.getSuperAdmin(), admin0.getPreferenceAdmin(), admin0.getAddress(), admin0.getZipCode(), admin0.getCity(), admin0.getCountry(), admin0.getEmail(), admin0.getProfile(), admin0.getPostLoginUrl(), admin0.getId());
                Admin loadedAdmin = adminRepository.findOne(admin0.getId());
                Admin myadmin = adminRepository.findByEmail(admin0.getEmail());
                Admin anadmin = adminRepository.findByLogin("qwerty");
                assertEquals("Toto", anadmin.getFirstname());
                assertEquals("Toto", myadmin.getFirstname());
                assertEquals("Toto", loadedAdmin.getFirstname());
                assertEquals("LeHeros", loadedAdmin.getLastname());
                

                然后我可以在日志中看到正在生成的 sql 语句:

                then I can see in the log the sql statement being generated:

                但是断言:

                assertEquals("Toto", myadmin.getFirstname());
                

                即使跟踪显示检索到相同的域对象,仍然失败:

                still fails even though the trace shows the same domain object was retrieved:

                TRACE [BasicExtractor] found [1037] as column [id14_]
                

                另一个 finder 让我感到困惑的另一件事是,它显示了一个限制 2 子句,即使它应该只返回一个 Admin 对象.

                One other thing that puzzles me with this other finder is that it shows a limit 2 clause even though it is supposed to return only one Admin object.

                我认为返回一个域对象时总会有一个限制 1.这是对 Spring Data 的错误假设吗?

                I thought there would always be a limit 1 when returning one domain object. Is this a wrong assumption on Spring Data ?

                在 MySQL 客户端中粘贴时,控制台日志中显示的 sql 语句,逻辑工作正常:

                When pasting in a MySQL client, the sql statements displayed in the console log, the logic works fine:

                mysql> insert into admin (version, address, city, country, email, firstname, lastname, login, password, 
                -> password_salt, post_login_url, preference_admin, profile, super_admin, zip_code) values (0,
                -> NULL, NULL, NULL, 'zemail@thalasoft.com039', 'zfirstname039', 'zlastname039', 'zlogin039',
                -> 'zpassword039', '', NULL, 0, NULL, 1, NULL);
                Query OK, 1 row affected (0.07 sec)
                
                mysql> select * from admin;
                +------+---------+---------------+--------------+-----------+--------------+---------------+-------------+------------------+---------+----------+------+---------+-------------------------+---------+----------------+
                | id | version | firstname | lastname | login | password | password_salt | super_admin | preference_admin | address | zip_code | city | country | email | profile | post_login_url |
                +------+---------+---------------+--------------+-----------+--------------+---------------+-------------+------------------+---------+----------+------+---------+-------------------------+---------+----------------+
                | 1807 | 0 | zfirstname039 | zlastname039 | zlogin039 | zpassword039 | | 1 | 0 | NULL | NULL | NULL | NULL | zemail@thalasoft.com039 | NULL | NULL | 
                +------+---------+---------------+--------------+-----------+--------------+---------------+-------------+------------------+---------+----------+------+---------+-------------------------+---------+----------------+
                1 row in set (0.00 sec)
                
                mysql> update admin set firstname='Toto', lastname='LeHeros', login='qwerty', super_admin=0, preference_admin=0, address=NULL, zip_code=NULL, city=NULL, country=NULL, email='stephane@thalasoft.com', profile=NULL, post_login_url=NULL where id=1807;
                Query OK, 1 row affected (0.07 sec)
                Rows matched: 1 Changed: 1 Warnings: 0
                
                mysql> select * from admin; +------+---------+-----------+----------+--------+--------------+---------------+-------------+------------------+---------+----------+------+---------+------------------------+---------+----------------+
                | id | version | firstname | lastname | login | password | password_salt | super_admin | preference_admin | address | zip_code | city | country | email | profile | post_login_url |
                +------+---------+-----------+----------+--------+--------------+---------------+-------------+------------------+---------+----------+------+---------+------------------------+---------+----------------+
                | 1807 | 0 | Toto | LeHeros | qwerty | zpassword039 | | 0 | 0 | NULL | NULL | NULL | NULL | stephane@thalasoft.com | NULL | NULL | 
                +------+---------+-----------+----------+--------+--------------+---------------+-------------+------------------+---------+----------+------+---------+------------------------+---------+----------------+
                1 row in set (0.00 sec)
                
                mysql> select admin0_.id as id14_, admin0_.version as version14_, admin0_.address as address14_, admin0_.city as city14_, admin0_.country as country14_, admin0_.email as email14_, admin0_.firstname as firstname14_, admin0_.lastname as lastname14_, admin0_.login as login14_, admin0_.password as password14_, admin0_.password_salt as password11_14_, admin0_.post_login_url as post12_14_, admin0_.preference_admin as preference13_14_, admin0_.profile as profile14_, admin0_.super_admin as super15_14_, admin0_.zip_code as zip16_14_ from admin admin0_ where admin0_.email='stephane@thalasoft.com' limit 2;
                +-------+------------+------------+---------+------------+------------------------+--------------+-------------+----------+--------------+----------------+------------+------------------+------------+-------------+-----------+
                | id14_ | version14_ | address14_ | city14_ | country14_ | email14_ | firstname14_ | lastname14_ | login14_ | password14_ | password11_14_ | post12_14_ | preference13_14_ | profile14_ | super15_14_ | zip16_14_ |
                +-------+------------+------------+---------+------------+------------------------+--------------+-------------+----------+--------------+----------------+------------+------------------+------------+-------------+-----------+
                | 1807 | 0 | NULL | NULL | NULL | stephane@thalasoft.com | Toto | LeHeros | qwerty | zpassword039 | | NULL | 0 | NULL | 0 | NULL | 
                +-------+------------+------------+---------+------------+------------------------+--------------+-------------+----------+--------------+----------------+------------+------------------+------------+-------------+-----------+
                1 row in set (0.00 sec)
                
                mysql> select admin0_.id as id14_, admin0_.version as version14_, admin0_.address as address14_, admin0_.city as city14_, admin0_.country as country14_, admin0_.email as email14_, admin0_.firstname as firstname14_, admin0_.lastname as lastname14_, admin0_.login as login14_, admin0_.password as password14_, admin0_.password_salt as password11_14_, admin0_.post_login_url as post12_14_, admin0_.preference_admin as preference13_14_, admin0_.profile as profile14_, admin0_.super_admin as super15_14_, admin0_.zip_code as zip16_14_ from admin admin0_ where admin0_.login='qwerty' limit 2;
                +-------+------------+------------+---------+------------+------------------------+--------------+-------------+----------+--------------+----------------+------------+------------------+------------+-------------+-----------+
                | id14_ | version14_ | address14_ | city14_ | country14_ | email14_ | firstname14_ | lastname14_ | login14_ | password14_ | password11_14_ | post12_14_ | preference13_14_ | profile14_ | super15_14_ | zip16_14_ |
                +-------+------------+------------+---------+------------+------------------------+--------------+-------------+----------+--------------+----------------+------------+------------------+------------+-------------+-----------+
                | 1807 | 0 | NULL | NULL | NULL | stephane@thalasoft.com | Toto | LeHeros | qwerty | zpassword039 | | NULL | 0 | NULL | 0 | NULL | 
                +-------+------------+------------+---------+------------+------------------------+--------------+-------------+----------+--------------+----------------+------------+------------------+------------+-------------+-----------+
                1 row in set (0.00 sec)
                

                那么为什么这没有反映在 Java 级别呢?

                So why is this not reflected at the Java level ?

                推荐答案

                EntityManager 默认不会自动刷新更改.您应该在查询语句中使用以下选项:

                The EntityManager doesn't flush change automatically by default. You should use the following option with your statement of query:

                @Modifying(clearAutomatically = true)
                @Query("update RssFeedEntry feedEntry set feedEntry.read =:isRead where feedEntry.id =:entryId")
                void markEntryAsRead(@Param("entryId") Long rssFeedEntryId, @Param("isRead") boolean isRead);
                

                这篇关于Spring Data JPA Update @Query 没有更新?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持跟版网!

                上一篇:Spring data jpa - 如何通过方法名称组合多个And和Or 下一篇:如何与 Spring Data REST 和 JPA 保持双向关系?

                相关文章

                    <bdo id='p9fLy'></bdo><ul id='p9fLy'></ul>
                1. <legend id='p9fLy'><style id='p9fLy'><dir id='p9fLy'><q id='p9fLy'></q></dir></style></legend>

                  <small id='p9fLy'></small><noframes id='p9fLy'>

                2. <tfoot id='p9fLy'></tfoot>

                  1. <i id='p9fLy'><tr id='p9fLy'><dt id='p9fLy'><q id='p9fLy'><span id='p9fLy'><b id='p9fLy'><form id='p9fLy'><ins id='p9fLy'></ins><ul id='p9fLy'></ul><sub id='p9fLy'></sub></form><legend id='p9fLy'></legend><bdo id='p9fLy'><pre id='p9fLy'><center id='p9fLy'></center></pre></bdo></b><th id='p9fLy'></th></span></q></dt></tr></i><div id='p9fLy'><tfoot id='p9fLy'></tfoot><dl id='p9fLy'><fieldset id='p9fLy'></fieldset></dl></div>