Условие замены строки в режиме гибернации

#java #oracle #hibernate #jpa #orm

#java #Oracle #спящий режим #jpa #orm

Вопрос:

У меня возникли некоторые проблемы при создании запроса, в котором необходимым условием является использование like в поле, где мне нужно заменить специальный символ. Что-то вроде этого:

 public List<MyClass> search(Myclass object){

Criteria cri = criteria(MyClass.class);
if(object.getName() != null){
    cri.add(Restrictions.sqlRestriction("replace(" cri.getAlias() ".name," object.getSpecialCharacter() ", '') like '" object.getName() "'"));  
}
if(dominio.getType()!= null){
    cri.add(Restrictions.eq("type", object.getType()));
}
if(dominio.getWorkspace() != null){
    cri.add(Restrictions.eq("workspace", object.getWorkspace()));
}
if(dominio.getStatus() != null){
cri.add(Restrictions.eq("status", object.getStatus()));
}

return cri.list();

}
  

С этим кодом я получил ошибку ниже:

 this_.ID_MYCLASS as ID_MYCLASS1_33_0_,
this_.NM_MYCLASS as NM_MYCLASS4_33_0_,
this_.ID_STATUS as ID_STATU5_33_0_,
this_.ID_TYPE as ID_TYPE_7_33_0_,
this_.ID_WORKSPACE as ID_WORKS8_33_0_ 
from KDTB_MYCLASS this_ 
where replace(this.name,'_', '') like 'COD' 
and this_.ID_WORKSPACE=?
  

ORA-00904: «ЭТО».»ИМЯ»: недопустимый идентификатор

Что я делаю не так?

Заранее спасибо!

Комментарии:

1. this.name это столбец таблицы, и вы хотите удалить «_» в его значении?

2. «_» — это просто пример. Специальный символ может меняться.

Ответ №1:

Попробуйте это вместо:

 cri.add(Restrictions.sqlRestriction("replace({alias}.name," object.getSpecialCharacter() ", '') like '" object.getName() "'"));
  

Комментарии:

1. Это сработало, чтобы найти псевдоним таблицы, но у меня все еще возникают проблемы с атрибутом «name», Hibernate сейчас генерирует следующий запрос:

2. Мне нужно знать псевдоним атрибута «name». Как я могу определить его псевдоним? ORA-00904: «THIS_».»NAME»: недопустимый идентификатор.

Ответ №2:

Вы могли бы попробовать это в качестве первого параметра sqlRestriction :

  "replace(" cri.getAlias() "_.name,"
  

В конечном счете, вы указываете, что HQL не поддерживает процедуру замены. Если у вас возникли дополнительные проблемы, рассмотрите возможность отказа от критериев и используйте для этого собственный SQL-запрос.