我正在阅读Spring Data JPA教程。 关于此框架如何在内部工作,我 困惑 。 让我说明具体情况
有特定代码
/**
* Custom finder
*/
public List<Location> getLocationByStateName(String name) {
@SuppressWarnings("unchecked")
List<Location> locs = entityManager
.createQuery("select l from Location l where l.state like :state")
.setParameter("state", name + "%").getResultList(); // note
return locs;
}
这只是被以下界面
取代@Repository
public interface LocationJPARepository extends JpaRepository<Location, Long> {
List<Location> findByStateLike(String stateName);
}
相应的测试用例工作正常
@Test
public void testFindWithLike() throws Exception {
List<Location> locs = locationRepository.getLocationByStateName("New");
assertEquals(4, locs.size());
}
新测试用例
@Test
public void testFindWithLike() throws Exception {
List<Location> locs = locationJPARepository.findByStateLike("New");
assertEquals(4, locs.size());
}
我的问题
希望我能够正确解释我的问题。如果我需要更加清晰,请告诉我。
答案 0 :(得分:9)
我建议您查看参考指南的Query Creation部分。它非常清楚地解释了规则。
例如,当您想要通过名字查找用户并忽略大小写时,您将使用类似findByFirstnameIgnoreCase
的方法名称,这将转换为UPPER(x.firstame) = UPPER(?1)
等条件。
默认情况下,当您使用findByProperty
方法时,匹配是完全匹配的,因此如果您想拥有LIKE
功能,则可以使用方法名称findByFirstnameLike
,而后者又会转换为条件{ {1}}。
您可以合并这些关键字,但它可能会有点疯狂。就个人而言,我更喜欢使用@Query
注释来处理更复杂的查询,以避免超长的存储库方法名称。