2017-03-01 10 views
0

チュートリアルと同様のWebアプリケーションを作成しました: https://spring.io/guides/tutorials/react-and-spring-data-rest/JPAでSpringのカスタムクエリ

postgresql dbを追加しましたが、すべて正常に動作します。私は基本的なクエリfindByUsername(String name)がうまく動作するリポジトリにあります。私の問題は、何らかの理由でカスタムクエリを作成できないということです。例えば

"SELECT CURRENT_TIMESTAMP"です。

私はちょうどこのステートメントの値を取得したいテストを行います。そして、できないで、私は:)

私のGoogleの検索結果は私のクラス

@Autowired EntityManager entityManager;

にこれを追加し、その上でクエリを作成するために私を提案したのか分からない意味します。しかし、何らかの理由でentityManagerが初期化されることはありません。常にnullを返します。これは正しい方法ですか、私はちょうど何かを欠いていますか? spring-boot-starter-jdbcを追加してJdbcTemplateを使用しようとしましたが、nullでもありました。

EDIT

私の問題は、春の少なすぎる知識でした。

私はこのようなクラスを持ち、そこでオートワイヤーを使用しようとしました。

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

私が後で理解したように、Springはこれを選択しません。私はPerson per = new Person("string");でRestControllerでこのクラスを呼び出しました。私が作った ソリューションは、私のRestControllerクラスにAutowire MyRepoにした、私の個人のコンストラクタの内容は、Personクラスでautowireを削除し、この

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

のように見えました。このようにして、私はmyRepoをPersonクラスで初期化してそこで使用することができました。これは私の問題のための最高のsoutionではありません。

私の2番目の問題です。私はこの作業をした後、PersonクラスにEntityManagerをautowireしようとしました。 MyRepoをEntityManagerに置き換え、初期化しました。今問題は私の次のコード行Integer i = (Integer) em.createNativeQuery("select 1", Integer.class).getSingleResult();です。ここでエラーが発生しますjavax.persistence.PersistenceException:org.hibernate.MappingException:不明なエンティティ:java.lang.Integer。 このステートメントの目的は、応答する場合、自分のDBへの簡単なクエリを作成することです。

+0

なぜ「h2」タグですか? –

+0

ああ、言及するのを忘れて、またh2の依存関係があります。これがここに関係するかどうかはわかりません。 – JamesLinux

+0

'@PersistenceContext EntityManager entityManager;'。 JPAはかなり複雑な獣です。 SpringとSpringのデータJPAがその上にあります。あなたはそれに入る前にドキュメンテーションを読む方がよいでしょう。 –

答えて

0

EntityManagerをautowireする必要はありません。Springはこれをすべて処理します。

代わりに、リポジトリに新しいメソッドを定義し、@Queryで注釈を付ける必要があります。

例:https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#jpa.query-methods.at-query

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

あなたは春のドキュメントで@Queryの使用に関するfurhter情報を見つけることができます。

+0

はい、これは私がそれをやったと思ったひとつの方法です。しかし、これは、私はいくつかの特定のリポジトリにAutowireする必要があることを意味します。可能であれば回避する方法を探しています。 – JamesLinux

0

最終的な解決策は:

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

ちょうどNatviveQuertからInteger.class部分を削除しました。私がそこにいて欲しいと思ったら、Integer用の新しいBeanを作ったはずです。
全体的に、これはSpringのベストプラクティスではありませんが、私の問題を解決しました。