Java Spring Boot JPQL在特定条件下不工作

Java Spring Boot JPQL在特定条件下不工作,java,spring,spring-boot,jpa,jpql,Java,Spring,Spring Boot,Jpa,Jpql,我在spring boot应用程序中面临与JPQL相关的问题。我面临的问题是“参数索引无效!您似乎声明的查询方法参数太少!”。无法按用户名和客户端代码获取记录。请检查我下面的Spring Boot应用程序代码段 Bean类UserClients.Java @Entity @Table(name = "usersclients") public class UserClients implements Serializable { @Id @GeneratedValue(stra

我在spring boot应用程序中面临与JPQL相关的问题。我面临的问题是“参数索引无效!您似乎声明的查询方法参数太少!”。无法按用户名和客户端代码获取记录。请检查我下面的Spring Boot应用程序代码段

Bean类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);

}
控制器类身份验证控制器

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

}
@CrossOrigin(origins=“*”,maxAge=3600)
@RestController
@请求映射(“/token”)
公共类身份验证控制器{
@自动连线
私有用户客户端服务用户客户端服务;
@RequestMapping(value=“/android generate token”,method=RequestMethod.POST)
公共ApiResponse loginActivity(@RequestBody LoginUserTo loginUser){
试一试{
final UserClients UserClients=userClientsService.fetchRecordByUserNameClient(loginUser.getUsername(),
loginUser.getClient());
if(userClients==null){
返回新的ApiResponse(401,“失败”,null);
}
返回新的ApiResponse(200,“success”,新的AuthToken(token,user.getUserName());
}捕获(身份验证异常e){
返回新的ApiResponse(401,e.getMessage(),null);
}
}
}
您的查询是错误的

1) 您已设置native=true,这意味着您希望使用SQL。但是查询看起来像HQL

2) 您应该使用命名参数

此外,我不确定您希望通过@Async实现什么。如果不返回将来的对象,此查询将永远不会异步运行

因此,您的查询应该如下所示:

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

}
@存储库
公共接口UserClientsRepository扩展了Crudepository{
@异步的
@查询(“从UserClients选择userCli userCli join userCli.user user join userCli.client client”+
“其中user.userName=:userName和client.clientCode=:clientCode”)
未来fetchRecordByUserNameClient(字符串用户名、字符串客户端代码);
}
您的查询是错误的

1) 您已设置native=true,这意味着您希望使用SQL。但是查询看起来像HQL

2) 您应该使用命名参数

此外,我不确定您希望通过@Async实现什么。如果不返回将来的对象,此查询将永远不会异步运行

因此,您的查询应该如下所示:

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

}
@存储库
公共接口UserClientsRepository扩展了Crudepository{
@异步的
@查询(“从UserClients选择userCli userCli join userCli.user user join userCli.client client”+
“其中user.userName=:userName和client.clientCode=:clientCode”)
未来fetchRecordByUserNameClient(字符串用户名、字符串客户端代码);
}