因此,spring-data
做了一些额外的魔术,可以帮助复杂的查询。起初很奇怪,您完全在文档中跳过了它,但它确实功能强大且有用。
它涉及创建一个自定义Repository
和一个自定义的“ RepositoryImpl”,并告诉Spring在哪里找到它。这是一个例子:
配置类- 指向您仍需要的xml配置,并带有指向您的存储库包的注释(它会立即*Impl
自动查找类):
@Configuration
@EnableJpaRepositories(basePackages = {"com.examples.repositories"})
@EnableTransactionManagement
public class MyConfiguration {
}
jpa-repositories.xml-告诉Spring
在哪里可以找到您的存储库。还告诉Spring
寻找具有CustomImpl
文件名的自定义存储库:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:jpa="http://www.springframework.org/schema/data/jpa"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:util="http://www.springframework.org/schema/util"
xsi:schemaLocation="http://www.springframework.org/schema/data/mongo http://www.springframework.org/schema/data/jpa/spring-jpa.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd">
<jpa:repositories base-package="com.example.repositories" repository-impl-postfix="CustomImpl" />
</beans>
MyObjectRepository
-在这里可以放置带注释和无注释的查询方法。请注意此存储库接口如何扩展该接口Custom
:
@Transactional
public interface MyObjectRepository extends JpaRepository<MyObject, Integer>, MyObjectRepositoryCustom {
List<MyObject> findByName(String name);
@Query("select * from my_object where name = ?0 or middle_name = ?0")
List<MyObject> findByFirstNameOrMiddleName(String name);
}
MyObjectRepositoryCustom
-更复杂且无法通过简单查询或注释处理的存储库方法:
public interface MyObjectRepositoryCustom {
List<MyObject> findByNameWithWeirdOrdering(String name);
}
MyObjectRepositoryCustomImpl
-您实际使用自动装配实现这些方法的位置EntityManager
:
public class MyObjectRepositoryCustomImpl implements MyObjectRepositoryCustom {
@Autowired
private EntityManager entityManager;
public final List<MyObject> findByNameWithWeirdOrdering(String name) {
Query query = query(where("name").is(name));
query.sort().on("whatever", Order.ASC);
return entityManager.find(query, MyObject.class);
}
}
令人惊讶的是,所有这些都组合在一起,并且当您执行以下操作时,两个接口(以及您实现的CRUD接口)中的方法都会显示出来:
myObjectRepository.
你会看见:
myObjectRepository.save()
myObjectRepository.findAll()
myObjectRepository.findByName()
myObjectRepository.findByFirstNameOrMiddleName()
myObjectRepository.findByNameWithWeirdOrdering()
它确实有效。您将获得一个查询界面。spring-data
确实为大型应用程序做好了准备。而且,您可以将更多查询放入简单查询或批注中只会获得更好的收益。
所有这些都记录在Spring Data Jpa站点上。
祝好运。