JPA - 如何使用LIKE运算符和AttributeConverter进行查询

时间:2015-06-08 20:26:05

标签: java jpa criteria-api

例如Customer的字段类型为PhoneNumber(值对象)。 在persistence.xml注册了PhoneNumberConverter javax.persistence.AttributeConverter。此转换器将PhoneNumber转换为字符串,反之亦然,因此JPA提供程序可以将PhoneNumbers存储到数据库中。

如何使用Criteria API在Customer上使用LIKE运算符查询PhoneNumberPhoneNumber只能是有效的电话号码。 <{1}}值PhoneNumber的{​​{1}}是不可能的。

2 个答案:

答案 0 :(得分:3)

简单的答案是使用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();

答案 1 :(得分:1)

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可能包含字符% 该问题的解决方案是String PhoneNumber的{​​{1}}:.as(String.class)PhoneNumber必须覆盖方法toString ()并返回电话号码。

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