2017-03-15 12 views
0

SpringデータMongoDBを使用してMongoDBで永続化しているRend APIを公開しているエンティティオブジェクトがあります。エンティティは、次のようになります。春データリポジトリを対応SpringデータREST、QueryDSL、HashMaps - HashMapプロパティを参照するときのURLからのNull述語

Entity.java

@Document 
public class Entity { 
     @Id 
     String id; 
     Map<String, String> properties; 
    } 

以下の通りです。それはQueryDslと春データのMongoDBの統合を活用:

EntityRepository.java

public interface EntityRepository extends MongoRepository<Entity, String> 
             ,QueryDslPredicateExecutor<Entity> { 
} 

ここで私が保存されたエンティティを問い合わせるそれを通してコントローラだ:

EntityController.java

@RestController 
@RequestMapping(value = "/entities") 
public class EntityController { 

    private static final Logger logger = LoggerFactory.getLogger(EntityController.class); 

    @Autowired 
    EntityRepository entityRepository; 

    @RequestMapping(method = RequestMethod.GET) 
    public Page<Entity> findAllEntities(Pageable pageable) throws ResourceQueryException { 
     return entityRepository.findAll(pageable); 
    } 

    @RequestMapping(method = RequestMethod.GET, value = "/q") 
    public Page<Entity> filterEntities(
      @QuerydslPredicate(root = Entity.class) Predicate predicate, 
      Pageable pageable) { 
     return entityRepository.findAll(predicate,pageable); 
    } 

} 

私がURLにヒットしたときlocalhost:8080/entities/q?id=xxx期待どおりに動作します。しかし、URL localhost:8080/entities/q?properties.p1=v1(クエリキーとMapプロパティの値)をヒットすると、私のメソッドでnull述語が返されるため、すべてのエンティティが返されます。

これを正しく動作させるにはどうすればよいですか?

答えて

0

propertiesフィールドをListとしてkey-valueのペアとして保存すると、そのフィールドを検索することができます。

あなたのクエリは次の構造で動作するはず

:あなたの答えのための

{ id : "1233454", 
    properties : [ 
     { "key : "key", "value" : "value" } 
    ] 
} 
+0

ありがとう!しかし、このスキーマを使用している間は、特定のプロパティを持つオブジェクトを照会するのが難しくなり、$ elematch構造に頼らざるを得なくなりました。 Spring Data Webでこれをサポートすることは、ひどく欠けているようです。 URLからPredicateオブジェクトを自動的に作成しながら問題に直面していたので、私は上記のMap アプローチに頼らなければなりませんでした。 –

+0

しかし、実際には、ここのようなカスタマイズしたバインディングを書くことができます:https://github.com/spring-projects/spring-data-examples/tree/master/web/querydsl構造は、 p1 = p2 'は機能しませんか、コンソールなどからあなたのために動作しますか? –