2017-03-01 135 views
0

我創建了一個類似於本教程的webapp: https://spring.io/guides/tutorials/react-and-spring-data-rest/春季自定義查詢JPA

我已經添加postgresql數據庫,一切工作正常。我有一個基本的查詢findByUsername(字符串名稱)在我的倉庫工作正常。我的問題是,我出於某種原因無法創建自定義查詢,例如

"SELECT CURRENT_TIMESTAMP"

可以說我做了一個測試,我只是想得到這個聲明的價值。並不能我的意思是我不知道:)

我的谷歌的結果如何建議我把它添加到我的班

@Autowired EntityManager entityManager;

,然後創建查詢上。但entityManager永遠不會初始化,總是返回null。這是正確的方式,我只是失去了一些東西?還嘗試添加spring-boot-starter-jdbc並使用JdbcTemplate,但也是null。

編輯

我的問題是春天的知識太少。

我有一個這樣的班級,並試圖在那裏使用Autowire。

public class Person { 
@Autowire 
MyRepo myRepo; 
private String p; 
public Person(String p) { 
    this.p = p; 
} 

正如我後面的理解,春季不接受這一點。我在一個RestController中用Person per = new Person("string");叫出這個類。 我提出的解決方案是自動裝配MyRepo我RestController類和我的人contstructor這個樣子

public Person(String p, MyRepo myRepo) { 
this.p = p; 
this.myRepo = myRepo; 
} 

刪除在Person類的自動裝配。通過這種方式,我設法在Person類中初始化myRepo並在那裏使用它。這不是我的問題的最佳解決方案。

我的第二個問題。在我得到這個工作之後,我嘗試將EntityManager自動裝配到我的Person類中。剛用EntityManager取代了MyRepo,它也被初始化了。現在的問題是我的下一個代碼行Integer i = (Integer) em.createNativeQuery("select 1", Integer.class).getSingleResult();。這裏我得到一個錯誤javax.persistence.PersistenceException:org.hibernate.MappingException:未知實體:java.lang.Integer。 本聲明的目的是對我的數據庫進行簡單的查詢,如果它響應。

+0

爲什麼'h2'標籤? –

+0

啊,忘了提及,也有h2依賴。不知道,如果這在這裏有關。 – JamesLinux

+0

'@PersistenceContext EntityManager entityManager;'。 JPA是一個相當複雜的野獸。而Spring和Spring-data-JPA就是其中之一。在深入研究之前,您最好閱讀文檔。 –

回答

0

您不需要自動編寫EntityManager,Spring會爲您處理所有這些問題。

取而代之,您需要定義一個新方法並用@Query對其進行註釋。

例子:

@Query(value = "select current_timestamp from #{#entityName} u") 
String findTimestamp(); 

您可以找到有關使用在簧文檔@Query furhter信息:https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#jpa.query-methods.at-query

+0

是的,這是我認爲這樣做的一種方式。但這意味着,我必須Autowire到某個特定的存儲庫。尋找一種可能的方式來避免。 – JamesLinux

0

最終的解決方案是:

Integer i = (Integer) em.createNativeQuery("select 1").getSingleResult(); 

只是刪除了Integer.class部分來自NatviveQuert。我想,如果我想讓它在那裏,我應該爲Integer製作一個新的bean。
總的來說這不是春季的最佳做法,但它解決了我的問題。