gpt4 book ai didi

java - JPA - FindByExample

转载 作者:IT老高 更新时间:2023-10-28 21:14:25 25 4
gpt4 key购买 nike

有没有人有一个很好的例子来说明如何在 JPA 中通过任何实体类型的反射在通用 DAO 中执行 findByExample?我知道我可以通过我的提供者(Hibernate)做到这一点,但我不想打破中立性......

似乎标准 API 可能是要走的路……但我不确定如何处理它的反射部分。

最佳答案

实际上,按示例查询 (QBE) 已被考虑包含在 JPA 2.0 规范中,但并未包含在内,即使主要供应商支持它。引用迈克·基思:

I'm sorry to say that we didn't actually get to do QBE in JPA 2.0. Criteria API does not have any special operators for it so entity equality is just like in JP QL, based on PK value. Sorry, but hopefully we'll be more successful on that front in the next go-round. For now it is one of those vendor features that every vendor supports, but is not in the spec yet.

以防万一,我为以下主要供应商添加了(非通用)示例代码,用于文档目的。

EclipseLink

以下是在 EclipseLink JPA 2.0 引用实现中使用 QBE 的示例:

// Create a native EclipseLink query using QBE policy
QueryByExamplePolicy policy = new QueryByExamplePolicy();
policy.excludeDefaultPrimitiveValues();
ReadObjectQuery q = new ReadObjectQuery(sampleEmployee, policy);

// Wrap the native query in a standard JPA Query and execute it
Query query = JpaHelper.createQuery(q, em);
return query.getSingleResult();

OpenJPA

OpenJPA 通过其扩展的 OpenJPAQueryBuilder 接口(interface)支持这种查询方式:

CriteriaQuery<Employee> q = cb.createQuery(Employee.class);

Employee example = new Employee();
example.setSalary(10000);
example.setRating(1);

q.where(cb.qbe(q.from(Employee.class), example);

hibernate

以及使用 Hibernate 的 Criteria API:

// get the native hibernate session
Session session = (Session) getEntityManager().getDelegate();
// create an example from our customer, exclude all zero valued numeric properties
Example customerExample = Example.create(customer).excludeZeroes();
// create criteria based on the customer example
Criteria criteria = session.createCriteria(Customer.class).add(customerExample);
// perform the query
criteria.list();

现在,虽然应该可以使用 JPA 2.0 标准 API 和反射以供应商中立的方式实现一些接近的东西,但我真的想知道是否值得付出努力。我的意思是,如果您将上述任何片段设为通用并将代码放入 DAO 方法中,那么如果需要,从一个供应商切换到另一个供应商将非常容易。我同意这并不理想,但仍然如此。

引用文献

关于java - JPA - FindByExample,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2880209/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com