2016-07-13 9 views
0

私は2つのエンティティを持つと仮定します。最初のエンティティは、1対多の関係を持つ2番目のエンティティの親です。SpringデータJPA with Querydsl - URLの配列内の値によるフィルタ

class Item { 
    String name; 
    Integer price; 
} 

class Order { 
    List<Item> items; 
    String customerName; 
} 

そして、私はこのように定義されたリポジトリがあります。その後

interface OrderRepository extends JpaRepository<Order, Long>, QueryDslPredicateExecutor<Order> { 
} 

を、私は自動的に次のように述語にパラメータをバインドするコントローラを持っている:

だから、
@RestController 
@RequestMapping(path = "/orders") 
class OrderController { 
    @RequestMapping(method = RequestMethod.GET) 
    List<Order> list(@QuerydslPredicate Predicate predicate) { 
     return orderRepository.findAll(predicate); 
    } 
} 

、私は照会することができますリポジトリから次のような特定のフィルタを使用して注文してください: curl -XGET http://localhost/orders?customerName=John

問題は、リスト内で値をフィルタリングできないことです。私は春のJPAとQuerydslで、リスト内の値をフィルタリングすることができますどのように質問があり、またhttp://localhost/orders?items.name=Bagを試みるが、そう

java.lang.NullPointerException 
    at org.springframework.util.ReflectionUtils.getField(ReflectionUtils.java:143) ~[spring-core-4.2.6.RELEASE.jar:4.2.6.RELEASE] 
    at org.springframework.data.querydsl.binding.QuerydslPredicateBuilder.reifyPath(QuerydslPredicateBuilder.java:185) ~[spring-data-commons-1.11.4.RELEASE.jar:?] 
    ... 

NullPointerExceptionを得ました。

注:私はquerydsl-JPA 3.7.4

おかげで春のブート1.3.4を使用します。

+1

[参考文献](http://docs.spring.io/spring-data/jpa/docs/current/reference/html/#core.web)に記載されている方法でバインディングを微調整しようとしましたか?型セーフ)、特にQuerydslBinderCustomizer? –

+0

@OliverGierkeカスタムバインドを追加しようとしましたが、失敗します。私は問題が 'item.name'のパスにアクセスしようとしているが、' ListPath 'のフィールドに' NullPointerException'を引き起こすフィールド名がない 'QuerydslPredicateBuilder#reifyPath'の周りに問題があると思います。私も自分で実装しようとしていますが、コードベースに関する知識はほとんどありません。どんな助けもありがとう。 – Stackle

答えて

1

実際には2倍のバグです。 -名をドットに私たちの翻訳は、あなたがこのようにカスタムバインディングを定義した場合でも、その特定のシナリオのために壊れている:箱から出して回収パストラバーサルを処理するために、私たちの失敗を回避するための解決策になる

bindings.bind(user.addresses.any().street).as("alias").first(…); 

  1. コレクションパストラバーサルが自動的にパス具象化時に追加any()への呼び出しを生じるはずである:あなたは両方の問題を解決するために、私はDATACMNS-883を提出してきました

  2. any()を含む手動で宣言された(およびエイリアス化された)パスバインディングは正しく動作するはずです。

修正が利用可能(最新のスナップショットを試してください)し、IngallsマイルストーンとHopper and Goslingサービスリリースの両方にスケジュールされています。

関連する問題