2016-06-01 8 views
0

Ich habe eine Anwendung basierend auf Spring Data JPA und Hibernate Search erstellt. In meiner indizierten Entität habe ich eine ClassBridge erstellt, die je nach Entität ein zusätzliches Feld hinzufügt, aber ich weiß nicht, wie ich dieses zusätzliche Feld bekommen soll.Fetch @ClassbBridge Feldwerte

hier ist meine Einheit:

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); 
      } 
     } 
... 
} 

und hier ist die Suchmethode nach Produktmodell:

@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; 
... 
} 

hier mein classBridge ist

@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; 
} 

Antwort

2

Sie haben das Feld Ihr Dokument verwendet den Standardnamen (der Name, der im Parameter name der Methode set übergeben wird), sodass Ihr Feld den Namen y hat ou wird in der ClassBridge-Annotation angegeben (z. B. "Image_url").

Verwenden Sie einfach diesen Feldnamen in Ihrer Suchanfrage.

Wenn Sie es holen wollen, müssen Sie Projektionen verwenden:

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]; 

Siehe https://docs.jboss.org/hibernate/search/3.2/reference/en/html/search-query.html#projections Referenz.

+0

Ich möchte nicht mit diesem Feld suchen, aber ich möchte seinen Wert abrufen –

+0

Die Antwort aktualisiert. –

+0

warum wirft es mir diese Ausnahme: 'Projizieren eines nicht gespeicherten Feldes: Image_url'. ... beachten Sie, dass ich die Indexierung gemacht habe und es erfolgreich durchgeführt wurde –