繁体   English   中英

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

[英]JPA - How to query with a LIKE operator in combination with an AttributeConverter

例如, Customer有一个PhoneNumber类型的字段(值对象)。 persistence.xml中,注册了一个实现javax.persistence.AttributeConverterPhoneNumberConverter 此转换器将PhoneNumber转换为字符串,反之亦然,因此JPA提供程序能够将PhoneNumbers存储到数据库中。

如何使用Criteria API在PhoneNumber使用LIKE运算符查询Customer PhoneNumber只能是有效的电话号码。 无法使用值为'+31%' PhoneNumber

简单的答案是使用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 ()并返回电话号码。

Customer_提供的元模型Customer并且可以由生成元模型发生器 。)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM