mysql - SQL 语法中的 JPA 错误

标签 mysql sql spring-data

我正在使用 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

我正在使用 MySql 和 MySQL5Dialect。

我的查询有什么问题?

**

更新:

**

已关注 this线程我已经更改了我的代码:

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 部分中使用的同一个表。此行为记录在:dev.mysql.com/doc/refman/5.6/en/update.html。

我该如何解决这个问题?有什么建议吗?

最佳答案

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

第一个,使用这个查询:

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

第二个:

我必须确保删除级联在数据库中得到很好的实现。由于某种原因,它没有自动生成。您可以看到my new thread这与这一点有关。

关于mysql - SQL 语法中的 JPA 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13960868/

相关文章:

mysql - 将所有 mysql 请求重定向到其他数据库服务器

java - 使用 Spring Security 注册创建 session

mysql - 在 mysql 中将行值设置为列值时检查相同的 ID

PHP图片压缩并上传到mysql

mysql - 谁卖的价格最低

sql - SQL Server 中的 DATALENGTH 对于多字节字符返回 1 BYTE

Java日历,将任务设置为重复

java - POJO 中的 SqlResultSetMapping

mysql - 将出生日期存储在数据库中作为 UNIX 时间?

sql - 如何连接多个 MySQL 查询同时排除某些结果?