在JPA中按对象属性查找

时间:2009-09-09 14:11:33

标签: java jpa

我想知道是否可以使用示例对象找到一个对象,就像你可以在hibernate中一样:

Cat cat = new Cat();
cat.Sex = 'F';
cat.Color = Color.Black;
List results = session.CreateCriteria(typeof(Cat)).Add( Example.Create(cat)).List();

我知道我可以通过主键找到,只是不期待写一百万行findByX,findByY等等。

感谢。

尼科

2 个答案:

答案 0 :(得分:2)

似乎正在考虑将Criteria API用于下一个JPA版本。有一些关于它的讨论here

现在看来,如果你想要Query by Example和Criteria功能,那么你将不得不使用Hibernate。

答案 1 :(得分:0)

因为它在当前的JPA API中不可用,我能看到如何实现它的唯一方法是使用它:

 public <T> List<T> findByAttribute(T object) {
    List<T> found = new ArrayList<T>();
    Map m = null;
    try {
        m = BeanUtils.describe(object);
    } catch (Exception ex) {
        return null;
    }

    String query = "select c from " + object.getClass().getSimpleName() + " c  where ";
    if (m != null) {
        for (Object key : m.keySet()) {
            if (!key.equals("class")) {
                Object value = m.get(key);

                if (value != null) {
                    try {
                        ConvertUtils.convert(m.get(key), PropertyUtils.getPropertyType(object, key.toString()));
                        query += " c." + key + " = :" + key + " and";

                    } catch (Exception ex) {
                        // the reason for this noncy try catch is so that you don't add parameters that are not primitives
                    }
                }
            }
        }
        query = query.substring(0, query.lastIndexOf("and"));
        Query q = getEntityManager().createQuery(query);
        for (Object key : m.keySet()) {
            if (!key.equals("class")) {
                if (m.get(key) != null) {
                    try {
                        Object o = ConvertUtils.convert(m.get(key), PropertyUtils.getPropertyType(object, key.toString()));
                        q.setParameter(key.toString(), o);
                    } catch (Exception ex) {
                        System.out.println("what we have here is a failure to communicate");
                        System.out.println("only primitive types allowed");
                    }
                }
            }
        }
        List resultList = q.getResultList();
        if (resultList != null) {
            found.addAll(resultList);
        }
    }
    return found;
}

但这只适用于我认为的原始类型。我想这是件事。

非常感谢

<磷>氮