JPA使用@IdClass复合主键时如何仅通过Id字段调用findById查询
问题原因
你使用@IdClass声明复合主键后,Spring Data JPA 自带的findById()方法默认要求传入完整的复合主键实例(也就是EmployeeId对象),无法直接仅传入单个id字段调用该默认方法。你之前尝试的命名方法不生效,是因为方法命名没有和实体类的字段名正确匹配。
可行解决方案
方案1:自定义符合命名规则的查询方法
直接在EmployeeRepository接口中新增如下方法即可,注意字段名要和你实体类中声明的Id严格匹配大小写:
// 注意:自带findById参数为EmployeeId,此处参数为String属于方法重载,不会冲突 // 如果你担心命名冲突,也可以改名为findByEmployeeId等其他名称 List<Employee> findById(String id);
如果你的id字段是全局唯一的,也可以将返回值改为Optional<Employee>。
方案2:使用@Query注解显式声明查询(更稳妥,避免命名歧义)
如果担心命名规则匹配出错,可以直接写JPQL指定查询逻辑:
import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Param; // 这里的e.Id要和你实体类中声明的字段名大小写完全一致 @Query("SELECT e FROM Employee e WHERE e.Id = :id") List<Employee> queryByEmployeeId(@Param("id") String id);
补充说明
如果你需要返回唯一的结果,需要保证业务上id字段全局唯一,否则按非唯一字段查询返回集合是更合理的选择。
内容的提问来源于stack exchange,提问作者Java Programmer
相关产品推荐
相关产品推荐

