私の Web アプリケーションでは、ユーザーの能力データを 0 ~ 5 のランキングで保存できます。Hibernate 検索 (Lucene の上に構築) を使用して、ランキング 3 の Java など、コンピテンス X が最小ランク A のすべてのユーザーを検索するクエリを作成したいと考えています。 、ランキング4のユーザーをランキング3のユーザーの前に配置します。これは可能だと思いますが、子オブジェクトのフィールドを組み合わせる方法がわかりません。私のデータ構造は次のようになります(簡略化):
ユーザークラス
@Entity
@Table(schema = "COMPETENCE", name = "users")
@Indexed
public class User{
@Id
@Field(store = Store.YES, index = Index.UN_TOKENIZED)
private Long id;
@OneToMany(mappedBy = "user")
@IndexedEmbedded
private List<UserCompetence> competenceList= new ArrayList<UserCompetence>();
// Snip: Other irrelevant fields and get/setters
}
UserCompetence.class
@Entity
@Table(name = "user_competence")
public class Competence {
@ManyToOne
@JoinColumn(name = "user_id", referencedColumnName = "id")
@NotNull
@ContainedIn
private User user;
@ManyToOne
@JoinColumn(name = "competence_id", referencedColumnName = "id")
@NotNull
@IndexedEmbedded
private Competence competence;
@Basic
@Field(index = Index.UN_TOKENIZED, store = Store.YES)
@NumericField
private Integer level;
// Snip: Other irrelevant fields and get/setters
}
@Entity()
@Table(name = "competence")
public class Competence{
@Column(name = "name")
@Field(index = Index.TOKENIZED, store = Store.YES)
private String name;
// Snip: Other irrelevant fields and get/setters
}
特定のコンピテンスと最低レベルを強制するクエリを作成しようとすると、そのコンピテンスと指定されたレベルのコンピテンスを持つすべての人が検索されるようです。正しい UserCompetence の子を持つユーザーのみを返すようにするにはどうすればよいですか? これを機能させるには、インデックスの一部を再マップする必要があると思います。