Тип столбца Cast Id - Long to Text, поэтому можно применять LIKE - PullRequest
0 голосов
/ 25 июня 2019

Я использую 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 и attributeBuilder я застреваю при попытке привести к тексту.

Я пытался использовать аннотацию @Formula в myOwnEntity:

 @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%")))

Я ожидаю увидеть в hibernate sql то же или похожее, что и в обычном sql.

1 Ответ

0 голосов
/ 25 июня 2019

Оставьте поле 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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...