Mysql SQL语法中的JPA错误
我正在使用Spring数据并创建以下查询: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
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);
}