将Id列类型强制转换为Long到Text,以便可以应用LIKE

时间:2019-06-24 21:08:06

标签: postgresql hibernate jpa casting

我正在使用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中看到的相同或相似。

1 个答案:

答案 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()