0

私はSpring Dataを使用しており、次のクエリを作成しました:

public interface UserRepository extends JpaRepository<User, Long>, QueryDslPredicateExecutor<User> {

    @Modifying
    @Query("DELETE FROM User u WHERE u.userDetails.userName = :username")
    public void deleteByUserName(@Param("username") String userName);
}

実行時に私は取得し続けます:

ERROR: org.hibernate.engine.jdbc.spi.SqlExceptionHelper - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'cross join UserDetails userdetail1_ where User_Name='rb2x5yv7'' at line 1

MySQL5Dialect で MySql を使用しています。

クエリの何が問題になっていますか?

**

アップデート:

**

このスレッドに続いて、コードを変更しました:

public interface UserRepository extends JpaRepository<User, Long>, QueryDslPredicateExecutor<User> {

    @Modifying
    @Query("DELETE FROM User u WHERE u.id in (SELECT u1.id FROM User WHERE u1.userDetails.userName = :username)")
    public void deleteByUserName(@Param("username") String userName);
}

しかし、今私は得ています:

org.hibernate.QueryException: Unable to resolve path [u1.id], unexpected token [u1] [DELETE FROM com.bs.dal.domain.User u WHERE u.id in (SELECT u1.id FROM com.bs.dal.domain.User WHERE u1.userDetails.userName = :username)]

**

更新 2:

**

サブクエリで「u1」が欠落していたようです。クエリを次のように変更しました。

 @Query("DELETE FROM User u WHERE u.id in (SELECT u1.id FROM User u1 WHERE u1.userDetails.userName = :username)")

今私は得ています:

org.hibernate.exception.GenericJDBCException: You can't specify target table 'Users' for update in FROM clause.

SELECT 部分で使用するのと同じテーブルを変更できないため、この問題が発生することはわかっています。

どうすれば回避できますか?助言がありますか?

4

2 に答える 2

1

それを機能させるために、私は2つのことをしなければなりませんでした:

最初に、次のクエリを使用します。

public interface UserRepository extends JpaRepository<User, Long>, QueryDslPredicateExecutor<User> {

    @Modifying
    @Query(name = "Delete User by UserName", value = "DELETE FROM User u WHERE u.id IN (SELECT ud.id FROM UserDetails ud WHERE ud.userName = :username)")
    public void deleteByUserName(@Param("username") String userName);
}

二番目:

削除カスケードが DB に適切に実装されていることを確認する必要があります。何らかの理由で、それは自動的に生成されませんでした。この点に関連する私の新しいスレッドを見ることができます。

于 2012-12-22T18:35:45.877 に答える
0

DELETE ステートメントでテーブル エイリアスを割り当てる適切な方法は次のとおりです。

DELETE u FROM User u WHERE u.userName = :username
       ^

もちろん、関連するテーブルが 1 つだけの場合は、単純にエイリアスを省略できます。

DELETE FROM User WHERE userName = :username
于 2012-12-21T09:30:42.153 に答える