我正在使用CriteriaBuilder创建一个返回MyOwnEntitiy列表的查询。在我的实体中,我有一个@Id,它是Long类型,但是当id如'%3%'时,我需要查询该实体。在普通sql中,我有几种选择:
select * from MyOwnTable where concat(id,id) like '%3'
select * from MyOwnTable where id::text like '%3'
select * from MyOwnTable where cast(id as text) like '%3'
但是当使用hibernate和criteriaBuilder时,尝试转换为文本时会卡住。
我尝试在myOwnEntity中使用@Formula批注:
@Formula("id::Text")
private String idToText;
但仍然得到异常:
java.lang.IllegalArgumentException:参数值[%3%]没有 匹配预期的类型[java.lang.Long(n / a)]
final CriteriaQuery<MyOwnEntitiy> criteriaQuery = CriteriaBuilder.createQuery(MyOwnEntitiy.class);
final Root<MyOwnEntitiy> myOwn = criteriaQuery.from(MyOwnEntitiy.class);
criteriaQuery.where(CriteriaBuilder.like(myOwn.get("idToText"), "%3%")))
我希望在休眠sql中看到的内容与在普通sql中看到的相同或相似。
答案 0 :(得分:0)
将id
字段保留为Long
public class MyOwnTable {
@Id
private Long id;
并在条件构建器中使用.as(String.class)
:
CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
final CriteriaQuery<MyEntity> criteriaQuery = criteriaBuilder.createQuery(MyEntity.class);
final Root<MyEntity> myOwn = criteriaQuery.from(MyEntity.class);
criteriaQuery.where(criteriaBuilder.like(myOwn.get("id").as(String.class), "%3%"));
TypedQuery<MyEntity> typedQuery = entityManager.createQuery(criteriaQuery);
List<MyEntity> myEntitiesContainingThreeInId = typedQuery.getResultList()