2016-12-03 10 views
-1

てからCreateQueryの使用方法通常、私はannotiations使用:findAllは春ブーツ

ようJpaRepository@Query("SELECT c FROM Country c")または事前に定義されたメソッドをが、私の場合、私は動的なクエリを生成します。私はこのようなコードレベルから同じクエリを実行する必要が

String baseQuery =SELECT c FROM Country c` 

if(age!=null) 
    baseQuery+="WHERE c.age=20" 

クエリQ1 = em.createQuery( "国CからCを選択");

が、私は、コードレベルからクエリを生成することができますどのように春ブーツ

EntityManagerを使用していけませんか?

+1

申し訳ありませんが、あなたのリポジトリのfindAll()メソッドを呼び出さないようにするにはどうすればよいですか? Spring Data JPAを使用しないときにJPAクエリを実行する方法を尋ねていますか?もしそうなら、あなたは何を試しましたか、あなたが直面している具体的な問題は何ですか? –

+0

動的クエリを生成したいので、findAll()を使用できません。 クエリは入力値に依存する必要があります – user3871754

+0

あなたはどんな問題に直面していますか?カスタムリポジトリメソッドの作成方法を理解するためにspring-data-jpaのドキュメントを読んだことがありますか? http://docs.spring.io/spring-data/jpa/docs/1.7.2.RELEASE/reference/html/#repositories.single-repository-behaviour –

答えて

0

あなたは春のブートを使用しているので、あなたはあなたのリポジトリにクエリを作成するために、春のデータを使用することができます。構文の

@Repository 
public interface CountryRepository extends JpaRepository<Country, Long> { 

} 

ない100%が、同様のものになるはずです。 は今、あなたはこのクラスautowireすることができます

@Autowired 
public CountryRepository countryRepo; 

をそして、すべての基本的な方法は、すでにあなたにご利用いただけますように:

countryRepo.findOne(id); 
countryRepo.find(); 

あなたは、より高度なクエリを作成したい場合は、春のデータなどを使用することができます:

@Repository 
public interface CountryRepository extends JpaRepository<Country, Long> { 

    public Country findByNameAndContinent(String name, String continent); 
} 

もちろん、これは単なる一例(愚かなもの)であり、あなたのCountryクラスヘクタールを前提としてい■フィールド名は「名前」と「大陸」で、どちらも文字列です。詳細はこちらをご覧ください: http://docs.spring.io/spring-data/jpa/docs/current/reference/html/ セクション5.3より具体的には、

PS:あなたは春のJdbcTemplateを利用することができ、コードから動的クエリを作成したい場合、あなたのCountryクラスが@Entity注釈

+0

私は申し訳ありませんが、私はひどく質問を定式化し、質問はカスタムクエリを作成する方法でした。今私はカスタムリポジトリ機能の実装によってそれを行うことができることを知っています:http://docs.spring.io/spring-data/jpa/docs/1.7.2.RELEASE/reference/html/#repositories.single-repository-behaviour – user3871754

0

を持っていることを確認してください。スプリングブートを使用すると、JdbcOperations beanをリポジトリクラスに注入するのと同じくらい簡単です(プロジェクトにspring-boot-startter-jdbcモジュールを提供したと仮定します)。

しかし、覚えておいてください!このソリューションは、JPQLではなくSQLを使用します。そのため、クエリで適切なテーブルとカラム名を使用して結果をオブジェクトに正しくマップする必要があります(RowMapperを使用)。

この単純な例は、私にとってはうまく機能しましたあなたの例に):

@Repository 
public class CountryRepository { 

    @Autowired 
    private JdbcOperations jdbcOperations; 

    private static String BASIC_QUERY = "SELECT * FROM COUNTRY"; 

    public List<Country> selectCoutry(Long age){ 
     String query = BASIC_QUERY; 
     if (age != null){ 
      query += " WHERE AGE = "; 
      query += age.toString(); 
     } 

     //let's pretend that Country has constructor Conutry(String name, int age) 
     return jdbcOperations.query(query, (rs, rowNum) -> 
      { return new Country(rs.getString("NAME"), rs.getInt("AGE");} 
     ); 
    }; 

} 

次に、あなたはCountryRepositoryと呼び出しメソッドを注入します。