1

価格が 100 ~ 200 の Item クラスのすべてのインスタンスを検索するためのクエリを設計するのに苦労しています。

これが私の Item クラスです:

@Entity
public class Item {
    @Id @DocumentId
    Long id

    @Field(index = Index.UN_TOKENIZED, store = Store.YES)
    @NumericField
    @FieldBridge(impl = BigDecimalNumericFieldBridge.class)
    BigDecimal price = BigDecimal.ZERO
}

ここで説明されているクラスは BigDecimalNumericFieldBridge です: https://hibernate.onjira.com/secure/attachment/15952/proposed_doc.txt

Luke は、価格が 100 から 200 の間のドキュメントがいくつかあることを教えてくれました。

これが私のクエリです:

FullTextSession fullTextSession = Search.getFullTextSession(session);
final QueryBuilder queryBuilder =     fullTextSession.getSearchFactory().buildQueryBuilder().forEntity(Item).get();

Query rootQuery = queryBuilder.bool()
    .must(queryBuilder.range().onField('price').above(100).createQuery())
    .must(queryBuilder.range().onField('price').below(200).createQuery())
    .createQuery();

FullTextQuery ftq = fullTextSession.createFullTextQuery(rootQuery, Item);
List<Item> instanceList = ftq.list();

しかし、境界に関係なく、リストは常に空です。私が間違っていることについて何か考えはありますか?

ちなみに、Hibernate 3.6.10 で Hibernate Search 3.4.1 を使用しています。

4

1 に答える 1

5

実際のところ、クエリの実行方法にエラーがありました。Hibernate Search はタイプ固有であり、私の値は long として格納されているため、long でクエリを実行する必要があります。そして、値に 100 を掛ける必要があります。これがブリッジの乗数だからです。

Query rootQuery = queryBuilder.bool()
    .must(queryBuilder.range().onField('price').above(10000L).createQuery())
    .must(queryBuilder.range().onField('price').below(20000L).createQuery())
    .createQuery();

単体テストの詳細な回答については、Hibernate フォーラムの次の投稿を参照してください: https://forum.hibernate.org/viewtopic.php?p=2457657#p2457657

于 2012-07-17T15:14:44.100 に答える