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 运算符查询 CustomerPhoneNumber 只能是有效的 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 可能包含字符 %.
问题的解决方案是转换为 PhoneNumberString.as(String.class)PhoneNumber 必须覆盖方法 toString () 和 return phone 数字。

(Customer_ 提供 Customer 的元模型,可能由 metamodel generator 生成。)