JPA - 如何结合 AttributeConverter 使用 LIKE 运算符进行查询
JPA - How to query with a LIKE operator in combination with an AttributeConverter
例如 Customer
有一个 PhoneNumber
类型的字段(值对象)。
在 persistence.xml
中注册了一个 PhoneNumberConverter
,它实现了 javax.persistence.AttributeConverter
。此转换器将 PhoneNumber
转换为字符串,反之亦然,因此 JPA 提供程序能够将 PhoneNumbers
存储到数据库中。
如何使用条件 API 在 PhoneNumber
上使用 LIKE
运算符查询 Customer
? PhoneNumber
只能是有效的 phone 数字。 PhoneNumber
的值类似于 '+31%'
是不可能的。
简单的答案是使用 NamedQuery
,但您也可以使用 CriteriaBuilder
。请注意,您必须提供正确的类型和搜索词。
像这样:
CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
CriteriaQuery<Tuple> criteriaQuery = criteriaBuilder.createTupleQuery();
Root root = criteriaQuery.from(/*The class youre searching*/);
Predicate predicate = criteriaBuilder.like(root.<String>get(/*field name*/), /*search values*/);
criteriaQuery.where(predicate);
criteriaQuery.select(root);
TypedQuery query = entityManager.createQuery(criteriaQuery);
List<T> result = query.getResultList();
public List<Customer> findCustomerByPhoneNumber(String phoneNumber) {
EntityManager em = getEntityManager();
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Customer> cq = criteriaBuilder.createQuery();
Root<Customer> customer = criteriaQuery.from(Customer.class);
Predicate predicate = cb.like(customer.get(Customer_.phoneNumber).as(String.class), phoneNumber);
cq.where(predicate);
TypedQuery<Customer> query = entityManager.createQuery(criteriaQuery);
return query.getResultList();
}
其中 phoneNumber
可能包含字符 %
.
问题的解决方案是转换为 PhoneNumber
的 String
:.as(String.class)
。 PhoneNumber
必须覆盖方法 toString ()
和 return phone 数字。
(Customer_
提供 Customer
的元模型,可能由 metamodel generator 生成。)
例如 Customer
有一个 PhoneNumber
类型的字段(值对象)。
在 persistence.xml
中注册了一个 PhoneNumberConverter
,它实现了 javax.persistence.AttributeConverter
。此转换器将 PhoneNumber
转换为字符串,反之亦然,因此 JPA 提供程序能够将 PhoneNumbers
存储到数据库中。
如何使用条件 API 在 PhoneNumber
上使用 LIKE
运算符查询 Customer
? PhoneNumber
只能是有效的 phone 数字。 PhoneNumber
的值类似于 '+31%'
是不可能的。
简单的答案是使用 NamedQuery
,但您也可以使用 CriteriaBuilder
。请注意,您必须提供正确的类型和搜索词。
像这样:
CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
CriteriaQuery<Tuple> criteriaQuery = criteriaBuilder.createTupleQuery();
Root root = criteriaQuery.from(/*The class youre searching*/);
Predicate predicate = criteriaBuilder.like(root.<String>get(/*field name*/), /*search values*/);
criteriaQuery.where(predicate);
criteriaQuery.select(root);
TypedQuery query = entityManager.createQuery(criteriaQuery);
List<T> result = query.getResultList();
public List<Customer> findCustomerByPhoneNumber(String phoneNumber) {
EntityManager em = getEntityManager();
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Customer> cq = criteriaBuilder.createQuery();
Root<Customer> customer = criteriaQuery.from(Customer.class);
Predicate predicate = cb.like(customer.get(Customer_.phoneNumber).as(String.class), phoneNumber);
cq.where(predicate);
TypedQuery<Customer> query = entityManager.createQuery(criteriaQuery);
return query.getResultList();
}
其中 phoneNumber
可能包含字符 %
.
问题的解决方案是转换为 PhoneNumber
的 String
:.as(String.class)
。 PhoneNumber
必须覆盖方法 toString ()
和 return phone 数字。
(Customer_
提供 Customer
的元模型,可能由 metamodel generator 生成。)