2017-11-21 8 views
0

Spring Data JPAの@Queryアノテーションにカラム名とその値を渡す方法を知りたかっただけです。Spring Data JPA - カラム名と値をパラメータとして渡します。

基本的に列名は静的で、すべての列をEntityクラスの要素として使用します。しかし、ここで私は別のものが欲しい、ここで列名は動的であるだろう私はリポジトリで定義されたメソッドにこの値をパラメータとして渡すだろう。

- カレンダー

- ID、PersonNameの、1、2、3 ...... 31の上方

は、テーブル構造、1,2,3であり、。 .... 31はカレンダーの日を表す列名で、その列に値があります。私は、Spring Data JPAを使用してDBからデータを取得しています。 ここでは、特定の日の人名を取得したかっただけです。 以下はリポジトリで定義された関数です。

@Query("select c from Calendar c where :calendarDay=:value") 
List<Calendar> getPersonName(@Param("calendarDay") String calendarDay, @Param("value") String value); 

これは私のためには機能しません。 ご協力いただければ幸いです。

+1

春のJPA Spelが役に立ちます。https://spring.io/blog/2014/07/15/spel-support-in-spring-data-jpa-query-definitions –

+0

あなたはCriteria API –

+0

を使用する必要がありますスプリングデータQueryDslの使用についてあなたはそれについて考えましたか? – pvpkiran

答えて

0

Spring JPAがサポートする唯一の動的パラメータは#{#entityName}です。 @Query注釈の動的な列名はサポートされていません。これが達成しようとしているものです。

唯一の選択肢は、QueryDSL、仕様、またはCriteria APIのいずれかを使用して手動でクエリを構成するか、クエリ文字列を作成してEntityManagerに渡すことです。それにかかわらず、コードを書く必要があります。

例えば参照してください:

0

sping data Specificationsを見てみましょう。そこにあなたのソリューションを見つけることができます!
あなたはCalendarがあなたのドメインである場合いることがわかりますドキュメントの読み込み、

、その後、あなたは上記のようなものを使用することができます(私は自分のドメインに別の名前を見つけるためにしようとするだろうが、すでにJava SEの Calendarクラスがあります)
@Repository 
public interface CalendarRepository extends JpaRepository<Calendar, Integer>, JpaSpecificationExecutor<Calendar> { 
} 


public class CalendarSpecification implements Specification<Calendar> { 

    private String randomColumnName; // A varchar column. 
    private String valueToSearchFor; 

    public CalendarSpecification(String randomColumnName, String valueToSearchFor) { 
     this.randomColumnName = randomColumnName; 
     this.valueToSearchFor = valueToSearchFor; 
    } 

    @Override 
    public Predicate toPredicate(Root<Calendar> root, CriteriaQuery<?> query, CriteriaBuilder builder) { 
     return builder.and(builder.equal(root.<String>get(this.randomColumnName), this.valueToSearchFor)); 
    } 
} 


@Service 
public class CalendarService { 

    @Autowired 
    private CalendarRepository calendarRepository; 

    public List<Calendar> findCustom(String randomColumnName, String valueToSearchFor) { 
     CalendarSpecification cs = new CalendarSpecification(randomColumnName, valueToSearchFor); 
     return calendarRepository.find(cs); 
     // Or using lambda expression - without the need of CalendarSpecification class. 
//  return calendarRepository.find((Root<ProductCategory> root, CriteriaQuery<?> query, CriteriaBuilder builder) -> { 
//   return builder.and(builder.equal(root.<String>get(randomColumnName), valueToSearchFor)); 
//  }); 
    } 
} 
関連する問題