3

如果我想要 EclipseLink 和 JPA 2.0 的类似功能

SELECT ... FROM ... WHERE name1=value1 AND name2=value2 OR name3=value3

哪个是最好的方法??在官方中这样说:

cq.where(cb.equal(pet.get(Pet_.name), "Fido")
    .and(cb.equal(pet.get(Pet_.color), "brown");

http://download.oracle.com/javaee/6/tutorial/doc/gjivm.html#gjiwu

但是 eclipselink 是不可能的,因为cb.equal(pet.get(Pet_.name), "Fido")它是一个Predicate而不是 anidate 查询.and

有任何想法吗?

4

2 回答 2

3

查看 CriteriaBuilder 上的 API 'and' 和 'or' 运算符,因此查询如下所示:

cq.where(cb.and(
    cb.equal(pet.get(Pet_.name), "Fido"),
    cb.equal(pet.get(Pet_.color), "brown")));

使用“名称”示例 where 子句,调用将是:

cq.where(cb.or(
    cb.and(cb.equal(BeanName_.name1, "value1"),
    cb.equal(BeanName_name2, "value2")),
    cb.equal(BeanName_.name3, "value3")));

如果您想使用参数,只需将硬编码值(即“value1”)替换为参数:

cb.parameter(String.class, "value1");
于 2010-09-02T13:26:51.687 回答
0

或者,您可能想要使用QueryDSL ,请参阅http://blog.mysema.com/2010/04/querydsl-as-alternative-to-jpa-2.html下的介绍。

QueryDSL 是 JPA 的一个很好的插件(在你的例子中是 EclipseLink),但也适用于 JDO、集合、SQL/JDBC、Lucene、MongoDB ......

于 2012-03-12T14:18:16.613 回答