Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql SQL语法中的JPA错误_Mysql_Sql_Spring Data - Fatal编程技术网

Mysql SQL语法中的JPA错误

Mysql SQL语法中的JPA错误,mysql,sql,spring-data,Mysql,Sql,Spring Data,我正在使用Spring数据并创建以下查询: public interface UserRepository extends JpaRepository<User, Long>, QueryDslPredicateExecutor<User> { @Modifying @Query("DELETE FROM User u WHERE u.userDetails.userName = :username") public void deleteByU

我正在使用Spring数据并创建以下查询:

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);
}
我正在使用MySql和MySQL5方言

我的问题出了什么问题

**

更新: **

以下线程我已更改代码:

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

更新2: **

看来我在子查询中缺少u1。将查询更改为:

 @Query("DELETE FROM User u WHERE u.id in (SELECT u1.id FROM User u1 WHERE u1.userDetails.userName = :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)]
org.hibernate.exception.GenericJDBCException: You can't specify target table 'Users' for update in FROM clause.
我知道会发生这种情况,因为您无法修改SELECT部件中使用的同一个表。此行为记录在:dev.mysql.com/doc/refman/5.6/en/update.html


我怎样才能解决这个问题?有什么建议吗?

在中分配表别名的正确方法是:

DELETE u FROM User u WHERE u.userName = :username
       ^
当然,如果只涉及一个表,您可以省略别名:

DELETE FROM User WHERE userName = :username

为了让它发挥作用,我必须做两件事:

首先,使用此查询:

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);
}
第二点:


我必须确保delete级联在DB中得到很好的实现。由于某些原因,它不是自动生成的。你可以看到这与这一点有关。

谢谢你的副本。根据您的评论,我已经更改了代码,但似乎仍然无法使其正常工作。更新问题。谢谢阿尔瓦罗。您的建议实际上与我的第一次尝试类似,但不能在批量HQL查询中指定隐式或显式联接,如下所述:
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);
}