1

さて、私はかなり奇妙なことをしようとしています。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をご覧ください。それは恐ろしいコメントのない混乱です。

4

1 に答える 1

1

わかった。で問題が発生した理由についての答えが見つかりましたCriteriaBuilder.isMember()。問題は、 が であるPath必要があることPath<? extends Collection>です。これで、isMember() は私が望んでいたように機能します。

于 2012-12-21T18:50:58.353 に答える