Проблема с Spring Data JPA @Query Annotation (ошибка в синтаксисе SQL) - PullRequest
0 голосов
/ 26 октября 2018

РЕДАКТИРОВАТЬ: Я хочу проверить, есть ли у определенного пользователя привилегии в группе.Если есть лучшее решение без запроса всех его привилегий, пожалуйста, сообщите мне.

Следующий запрос дает мне одну ошибку, которую я не мог понять:

@Repository
public interface PrivilegeRepository extends JpaRepository<Privilege, Long> {

    @Query("select p from Privilege p " +
            "inner join p.userTypes " +
            "inner join UserGroup u " +
            "where u.user.id=:uid and u.group.id=:gid")
    List<Privilege> getPrivilegesOfUser(@Param("uid") Long uid, @Param("gid") Long gid);

}

ошибка:

com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: 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 'where usergroup1_.user_id=28 and usergroup1_.group_id=18' at line 1
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) ~[na:1.8.0_144]
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) ~[na:1.8.0_144]
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) ~[na:1.8.0_144]
    at java.lang.reflect.Constructor.newInstance(Constructor.java:423) ~[na:1.8.0_144]

Сущность UserGroup

@Entity
@Table(name = "user_to_group")
public class UserGroup {

    @EmbeddedId
    private UserGroupId id;

    @ManyToOne(fetch = FetchType.LAZY,
            cascade = {CascadeType.DETACH, CascadeType.MERGE,
                    CascadeType.REFRESH, CascadeType.PERSIST})
    @MapsId("userId")
    @JoinColumn(name = "user_id", insertable = false, updatable = false)
    private User user;

    @ManyToOne(fetch = FetchType.LAZY,
            cascade = {CascadeType.DETACH, CascadeType.MERGE,
                    CascadeType.REFRESH, CascadeType.PERSIST})
    @MapsId("groupId")
    @JoinColumn(name = "group_id", insertable = false, updatable = false)
    private Group group;

    @ManyToOne(fetch = FetchType.LAZY,
            cascade = {CascadeType.DETACH, CascadeType.MERGE,
                    CascadeType.REFRESH, CascadeType.PERSIST})
    @JoinColumn(name = "user_type_id")
    private UserType userType;

    @Column(name = "is_blocked",
    insertable = false)
    private boolean isBlocked = false;

Сначала я попробовал эквивалентный запрос в MYSQL Workbench и работал просто отлично.Ничего с реализацией репозитория Jpa.Это код, который работает на MYSQL:

select p.name from privilege p 
    inner join user_type_to_privilege utp 
        on p.id=utp.privilege_id
    natural join user_to_group utg
    where utg.user_id=16 and
        utg.group_id=9;

Это диалект, который я использую: spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQLDialect Это устаревший или что-то?

1 Ответ

0 голосов
/ 26 октября 2018

Проблема была во втором внутреннем соединении.Это было неоднозначно и не знал, какой столбец подойдет для объединения.Запрос, который работает:

@Query("select p from Privilege p " +
            "inner join p.userTypes t " +
            "inner join UserGroup u on t.id=u.userType.id "+
            "where u.user.id=:uid and u.group.id=:gid")
    List<Privilege> getPrivilegesOfUser(@Param("uid") Long uid, @Param("gid") Long gid);
...