Spring Boot JPQL не работает для определенных условий - PullRequest
0 голосов
/ 04 июня 2019

У меня проблема с JPQL в приложении весенней загрузки. Я столкнулся с проблемой "Неверный индекс параметра! Вы, кажется, объявили слишком мало параметров метода запроса!" , Невозможно получить запись по имени пользователя и коду клиента. Пожалуйста, проверьте мой фрагмент кода ниже для Spring Boot Application.

Бин класса UserClients.Java.

@Entity
@Table(name = "usersclients")
public class UserClients implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long ID;

    @JsonBackReference
    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "userName", referencedColumnName = "userName")
    private Users user;

    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "clientCode", referencedColumnName = "code")
    private Clients client;
}

Класс репозитория UserClientsRepository

@Repository
public interface UserClientsRepository extends CrudRepository<UserClients, Long> {

@Async
@Query(value = "from UserClients userCli join userCli.user user  join userCli.client client  where user.userName= ?0 and client.clientCode= ?1", nativeQuery = true)
UserClients fetchRecordByUserNameClient(String userName,String clientCode);

}

Класс обслуживания UserClientsService

@Service
public class UserClientsService {

    @Autowired
    private UserClientsRepository userClientsRepository;


    public UserClients fetchRecordByUserNameClient(String username, String clientCode) {
        return userClientsRepository.fetchRecordByUserNameClient(username, clientCode);
    }

}

Контроллер класса AuthenticationController

@CrossOrigin(origins = "*", maxAge = 3600)
@RestController
@RequestMapping("/token")
public class AuthenticationController {


    @Autowired
    private UserClientsService userClientsService;


    @RequestMapping(value = "/android-generate-token", method = RequestMethod.POST)
    public ApiResponse<AuthToken> loginActivity(@RequestBody LoginUserDto loginUser) {
        try {
            final UserClients userClients= userClientsService.fetchRecordByUserNameClient(loginUser.getUsername(), 
                    loginUser.getClient());
            if(userClients == null) {
                return new ApiResponse<>(401, "failed", null);
            }
            return new ApiResponse<>(200, "success", new AuthToken(token, user.getUserName()));
        } catch (AuthenticationException e) {
            return new ApiResponse<>(401, e.getMessage(), null);
        }
    }

}

1 Ответ

2 голосов
/ 04 июня 2019

Ваш запрос неверен.

1) вы установили native = true, что означает, что вы хотите использовать SQL.Но запрос выглядит как HQL

2) вы должны использовать именованные параметры.

Кроме того, я не уверен, чего вы хотите добиться с помощью @Async.Этот запрос никогда не будет выполняться асинхронно без возврата объекта Future.

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

@Repository
public interface UserClientsRepository extends CrudRepository<UserClients, Long> {

    @Async
    @Query("select userCli from UserClients userCli join userCli.user user join userCli.client client "+ 
           "where user.userName= :userName and client.clientCode= :clientCode")
    Future<UserClients> fetchRecordByUserNameClient(String userName,String clientCode);

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...