さて、私はかなり奇妙なことをしようとしています。CriteriaBuilder と CriteriaQuery を使用して、エンティティのコレクションに特定のオブジェクトを含むすべてのエンティティを返そうとしています。私はこれに対して何時間も頭を悩ませてきましたが、関連するドキュメントはほとんどなく、特に役に立ちません。どんな助けでも大歓迎です。
関連するクラスの抜粋は次のとおりです。
@Entity
public class Entry {
@ManyToMany(fetch=FetchType.EAGER)
private List<Tag> tags = new ArrayList<Tag>();
}
@Entity
public class Tag {
@Size(min=1,max=63)
@Column(unique=true)
@NotNull
private String name;
}
@Repository
@Transactional
public class EntryDaoImpl extends RefineableDao implements EntryDao{
@Autowired
private EntityManager em;
@Override
public List<Entry> search(final Map<String,Object> refinement){
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Entry> query = cb.createQuery(Entry.class);
Root<Entry> entry = query.from(Entry.class);
query.orderBy(cb.desc(entry.get("createTime")));
query.select(entry);
query.where(this.refineQuery(refinement, cb, query, entry));
return em.createQuery(query).getResultList();
}
}
したがって、基本的に、特定のタグを含むエントリを見つけることができる必要があります。これが私が行っていた唯一の改良であった場合、非常に簡単に実行できることはわかっていますが、同じ CriteriaQuery に対して他にも多くの改良が行われており、どの改良が行われるかについての保証はありません。
バックエンドについて本当に知りたい場合は、http://pastebin.com/QJnkYRRhをご覧ください。それは恐ろしいコメントのない混乱です。