1

私は持っている

@Document
public class Employee
{
 @Id
 Long empCode;
 String empSurname;
 String address;
// getters setters
}

次のようなMongoリポジトリを使用してクエリを作成しました

public interface EmployeeRepository extends MongoRepository<Employee, Long>
{

List<Employee> findEmployeesByEmpCode(int empCode);

@Query(value="{ 'empCode' : ?0 }", fields="{ 'address' : 1}")
List<String> findAddressByEmpCode(int empCode);

最初のクエリは機能しますが、2 番目のクエリは失敗します。返されるリストのタイプを従業員に変更した場合にのみ機能します。

失敗時のエラーは

java.lang.IllegalArgumentException: [Assertion failed] - this argument is required; it must not be null
    at org.springframework.util.Assert.notNull(Assert.java:115)
    at org.springframework.util.Assert.notNull(Assert.java:126)
    at org.springframework.data.convert.EntityInstantiators.getInstantiatorFor(EntityInstantiators.java:86)
    at org.springframework.data.mongodb.repository.query.DtoInstantiatingConverter.<init>(DtoInstantiatingConverter.java:61)
    at org.springframework.data.mongodb.repository.query.MongoQueryExecution$ResultProcessingConverter.convert(MongoQueryExecution.java:376)
    at org.springframework.data.mongodb.repository.query.MongoQueryExecution$ResultProcessingExecution.execute(MongoQueryExecution.java:345)
    at org.springframework.data.mongodb.repository.query.AbstractMongoQuery.execute(AbstractMongoQuery.java:91)

明らかに、含まれている Employee オブジェクトの値を String に変換する方法がわかりません。どうすればこれを実装できますか? どんな例でも大歓迎です。

ありがとう、

4

1 に答える 1

1

このfields属性は、ドメイン オブジェクト ( Employee) に設定されていないプロパティをフィルター処理するために使用されます。MongoDB のプロジェクション メカニズムとはあまり関係ありません。

ここでプロジェクションを使用するには、リファレンス ドキュメントのプロジェクションを参照してください。

プロジェクション インターフェイスを作成する必要があります。

interface AddressesProjection { String getAddress(); }

それに応じてリポジトリ メソッドの署名を変更します。

List<AddressesProjection> findByEmpCode(int empCode);

プロジェクションは、基になる型と、公開されたプロパティに関連するメソッド シグネチャとの間のコントラクトを宣言します。したがって、基になる型のプロパティ名に従って getter メソッドに名前を付ける必要があります。

これはあなたが得ることができる最も近いものです。

于 2016-05-05T12:19:32.843 に答える