2016-06-01 8 views
0

私はSpring Data JPAとHibernate Searchに基づいてアプリケーションを作成しました。インデックスに登録されたエンティティでは、エンティティに応じて余分なフィールドを追加するClassBridgeを作成しましたが、この余分なフィールドを取得する方法はわかりません。ここ@ClassbBridgeフィールド値を取得する

は私の実体である:

@Indexed 
@ClassBridge(name="Image_url", 
impl = ImageUrlClassBridge.class) 
@Entity 
@Table(name="PRODUCTS") 
public class ProductModel { 

    @Id 
    @GeneratedValue(strategy=GenerationType.IDENTITY) 
    private Integer id; 
    @Field([email protected](definition="ngram")) 
    private String name; 
... 
} 
ここ

私classBridgeです:あなたはにフィールドを追加

@SuppressWarnings("unchecked") 
public List<ProductModel> search(String keyword) { 
    FullTextEntityManager ftem = org.hibernate.search.jpa.Search.getFullTextEntityManager(entityManager); 
    QueryBuilder queryBuilder = ftem.getSearchFactory().buildQueryBuilder().forEntity(ProductModel.class).get(); 
    Query query =queryBuilder.keyword().onField("name").matching(keyword).createQuery(); 
    FullTextQuery jpaQuery =ftem.createFullTextQuery(query, ProductModel.class); 
    List<ProductModel> results = jpaQuery.getResultList(); 
    return results; 
} 

答えて

2

public class ImageUrlClassBridge implements FieldBridge,ParameterizedBridge { 

    private ProductsService productsService; 



    @Override 
    public void set(String name, Object value, Document document, LuceneOptions luceneOptions) { 
     ProductModel product=(ProductModel) value; 
     productsService=ApplicationContextProvider.getApplicationContext().getBean(ProductsService.class); 
     ImageModel image=productsService.findImageByProduct(product.getId()); 

     if(!ObjectUtils.isEmpty(image)){ 
      Logger.getAnonymousLogger().info("\nIMAGE FOUND : "+image.getId()); 
      Field field = new Field(name,image.getUrl(), luceneOptions.getStore(), 
        luceneOptions.getIndex(), luceneOptions.getTermVector()); 
        field.setBoost(luceneOptions.getBoost()); 
        document.add(field); 
      } 
     } 
... 
} 

、ここでは、製品モデルの検索方法であり、あなたのフィールドの名前がyになるように、デフォルトの名前(setメソッドのnameパラメータで渡される名前)を使用してドキュメントを作成するClassBridge注釈で指定されたou(すなわち、 "Image_url")。

検索クエリでこのフィールド名を使用してください。

あなたはそれを取得したい場合は、投影を使用する必要があります。

FullTextQuery jpaQuery = ftem.createFullTextQuery(query, ProductModel.class); 
jpaQuery.setProjection(FullTextQuery.THIS, "Image_url"); 
List results = jpaQuery.list(); 
Object[] firstResult = (Object[]) results.get(0); 
ProductModel productModel = firstResult[0]; 
String imageUrl = firstResult[1]; 

参照https://docs.jboss.org/hibernate/search/3.2/reference/en/html/search-query.html#projections参考のために。

+0

私はそのフィールドで検索したくないですが、その値を取得したい –

+0

答えを更新しました。 –

+0

なぜこの例外は私にスローされますか: '未保存フィールドの投影:Image_url'。 ...私はindextionを行って、それはsuccesfuly完了したことに注意してください –

関連する問題