有没有办法减少与CriteriaQuery相关的样板代码量(在JPA 2.0中)?

And*_*rey 7 java jpa criteriaquery jpa-2.0

我喜欢类型安全CriteriaQuery带来了JPA 2.0,但它也带来了一些样板代码.例如,假设我有一个名为NamedEntity的实体,它只有一个id和一个名为"name"的String字段(假设它将唯一约束设置为true).以下是NamedEntityManager的外观:

public class NamedEntityManager
{
    //inject using your framework
    EntityManager entityManager;

    //retrieve all existing entities of type NamedEntity from DB
    public Iterable<NamedEntity> queryAll()
    {
        CriteriaBuilder builder = entityManager.getCriteriaBuilder();
        CriteriaQuery<NamedEntity> query = builder.createQuery(NamedEntity.class);
        return entityManager.createQuery(query).getResultList();
    }

    //retrieve a single entity of type NamedEntity from DB using specified name
    public NamedEntity queryByName(String name)
    {
        CriteriaBuilder builder = entityManager.getCriteriaBuilder();
        CriteriaQuery<NamedEntity> query = builder.createQuery(NamedEntity.class);
        Root<NamedEntity> root = query.from(NamedEntity.class);
        query = query.where(root.<NamedEntity>get("name").in(name));

        //skipped the try/catch block for the sake of brevity
        return entityManager.createQuery(query).getSingleResult();
    }
}
Run Code Online (Sandbox Code Playgroud)

有没有办法压缩代码,以避免复制/粘贴相同的代码行到每个查询方法?也许以某种方式重用CriteriaQuery对象?

Coj*_*nes 5

我正在寻找类似的东西,你可以看看Querydsl(LGPL 许可),它可以将 JPA 作为后端。

我仍在阅读它,但从他们的例子来看,它看起来很干净。

HQLQuery q = new HibernateQuery(session);
QCat cat = new QCat("cat"); // query type
List<Cat> cats = q.from(cat).where(cat.name.between("A", "B")).list(cat);
Run Code Online (Sandbox Code Playgroud)


And*_*rey 1

看来没有办法减少代码量了。我想必须牺牲一些东西才能获得类型安全。