因此,spring-data
做了一些額外的魔法,可以幫助處理複雜的查詢。起初很奇怪,你完全在文檔中跳過它,但它非常強大和有用。
它涉及到創建一個自定義Repository
和一個自定義`RepositoryImpl'並告訴Spring在哪裏找到它。這裏有一個例子:
配置類 - 點到你仍然需要XML配置與註釋指向您的倉庫包(它看起來*Impl
類自動至今):
@Configuration
@EnableJpaRepositories(basePackages = {"com.examples.repositories"})
@EnableTransactionManagement
public class MyConfiguration {
}
JPA的資料庫.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 site。
祝你好運。
據我所知,它沒有什麼區別。跟你更舒服的那個一起去吧。爲什麼辯論? – duffymo
我顯然對Hibernate更加熟悉,但如果我可以做同樣的事情並提高生產力,我寧願採用更新的方法。但是,如果Hibernate的功能更強大,我會遇到更少的問題,那麼這是我想知道的。 – egervari
JPA是使用Hibernate作爲衆多實現之一的ORM的泛化。你有什麼權力歸屬於彼此? JPA是一個標準,但我看不出兩者之間的區別。爲了充分披露,我會說我不關心任何一個。兩者都爲你生成SQL。我寧願自己寫。 ORM並非針對每個問題和每個用戶。 – duffymo