代码之家  ›  专栏  ›  技术社区  ›  Sitansu

Spring Boot JPQL不适用于特定条件

  •  0
  • Sitansu  · 技术社区  · 5 年前

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

    服务类UserClientsService

    @Service
    public class UserClientsService {
    
        @Autowired
        private UserClientsRepository userClientsRepository;
    
    
        public UserClients fetchRecordByUserNameClient(String username, String clientCode) {
            return userClientsRepository.fetchRecordByUserNameClient(username, 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);
            }
        }
    
    }
    
    1 回复  |  直到 5 年前
        1
  •  2
  •   Simon Martinelli    5 年前

    你的问题不对。

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