2017-02-12 3 views
1

Salam,Поиск по ключевой ценности Объект

У меня проблема с поиском сущности (ключ, значение).

Я не понять, как написать запрос jpql сделать поиск .. это моя проблема

Я документ объект, отображается в oneToMany «МЕТАДАННЫЕ» сущность

@Entity 
public class Document implements Serializable { 

    private static final long serialVersionUID = 1L; 

    @Id 
    @Column(name="id_document") 
    private Integer idDocument; 

    @Column(name="date_enregistrement") 
    private Timestamp dateEnregistrement; 

    // other columns 

    //bi-directional many-to-one association to MetaData 
    @OneToMany(mappedBy="document") 
    private List<MetaData> metaData; 

    /* 
    getters and setters 
    */ 
} 

и MetaData объект

@Entity 
@Table(name="meta_data") 
public class MetaData implements Serializable { 

    private static final long serialVersionUID = 1L; 

    @Id 
    @Column(name="id_meta_data") 
    private Integer idMetaData; 

    @Column(name="key") 
    private String key; 

    @Column(name="value") 
    private String value; 

    //bi-directional many-to-one association to Document 
    @ManyToOne 
    @JoinColumn(name="id_document") 
    private Document document; 

    /* 
    getters and setters 
    */ 

} 

Что я хочу сделать, это искать документы, предоставляя некоторые метаданные в качестве параметров.

примеры:

Поиска документы, где отправитель (ключ = отправитель) является Юсуф (значение = Юсуф) и приемник (ключ) Хамза (значение)

вполне возможно, что клиент обеспечивает более двух параметров ,

Спасибо advace

+0

поэтому о поиске документов, которые МЕТАДАННЫЕ, у которых есть определенные пары ключ/значение (и все эти пары должны быть там) - это правильно? –

+0

да точно :(@Maciej Kowalski – zez

ответ

0

Как пар ключ-значение может изменяться в количестве, я предлагаю пойти с CriteraQuery для более гибкость человека:

CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder(); 
CriteriaQuery<Document> query = criteriaBuilder.createQuery(Document.class); 
Root<Document> root = query.from(Document.class); 
Join<Document, MetaData> metadataJoin = root.join("metaData", JoinType.INNER); 
List<Predicate> predicateList = new LinkedList<Predicate>(); 
//If a map contains all your key value pairs 
for(Map.Entry<String, String> entry : keyValueMap.entrySet()){ 
    predicateList.add(
    criteriaBuilder.and(
     criteriaBuilder.equal(metadataJoin.get("key"), entry.getKey()), 
     criteriaBuilder.equal(metadataJoin.get("value"), entry.getValue()) 
    ) 
); 
} 
query.where(criteriaBuilder.or(
    predicateList.toArray(new Predicate[predicateList.size()])) 
) 
query.groupBy(root.get("idDocument")); 
query.having(criteriaBuilder.equal(criteriaBuilder.count(root.get("idDocument")), predicateList.size())); 
List<Document> documentList = entityManager.createQuery(query).getResultList(); 
+0

Что такое ': metadataList', который должен содержать? JPA будет выполнять сравнения идентичности в операторах' IN', в то время как в вопросе утверждается, что только пары «ключ/значение» доступны в качестве ввода – crizzis

+0

. редактируя его для полного ответа – grizzly

+0

Я никогда не работал с CriteriaQuery, прежде чем я дам ему попробовать завтра, когда я буду рядом с моим компьютером, thx;) – zez

Смежные вопросы