2016-12-11 7 views
0

Я этот запрос в моем даоJava Hibernate - псевдоним в запросе не найден

Query q = entityManager.createQuery("SELECT geoCity,(CASE WHEN geoCity.name LIKE :search1 THEN 0 ELSE 1 END) as myOrder FROM GeoCity geoCity WHERE (LOWER(geoCity.name) LIKE :search) ORDER BY geoCity.myOrder ,geoCity.name"); 

это лицо

import java.util.HashSet; 
import java.util.Set; 
import javax.persistence.*; 

/** 
* GeoCity generated by hbm2java 
*/ 
@Entity 
@Table(name="geo_city" ,schema="public") 
public class GeoCity implements java.io.Serializable { 
    ..... 

    public transient Integer myOrder; 

    public GeoCity() { 
    } 

    public GeoCity(String istat) { 
     this.istat = istat; 
    } 


    @Transient 
    public Integer getMyOrder() { 
     return myOrder; 
    } 

    public void setMyOrder(Integer myOrder) { 
     this.myOrder = myOrder; 
    } 
} 

geoRegion.myOrder не является действительным. но мне нужно использовать случай, когда внутри моего запроса заказывается особым образом. есть ли способ?

+0

извините плохую копию и мимо – ciro

ответ

0

это потому, что ваша декларация transient.

public transient Integer myOrder; // this is transient 

попытаться удалить transient.

public Integer myOrder; 

и удалить аннотацию @Transient в вашем методе.

Переходных средства, переменное вы объявили это неserializable, поэтому это неверный вход в спящем режиме. Нажмите эту ссылку для получения дополнительной информации в Transient Keyword.

+0

, но если вы используете переходный не бывает, что, когда я пытаюсь вставить запись, он говорит, что моя колонка Myorder не существует? Я хорошо помню. Теперь я не могу доказать, почему код на моем домашнем компьютере, но сегодня я проверяю. – ciro

+0

Столбец 'myOrder' не существует в спящем режиме, потому что вы используете' transient' в этом поле, что означает, что вы не будете разделять вашу сериализацию на спящий режим. вы можете использовать переменную 'myOrder' внутри вашего кода, но она не может быть сериализована с помощью спящего режима, если вы не устраните переходный процесс на нем. – msagala25

+0

Если я не использую переходный процесс, я получаю следующее сообщение об ошибке: «Caused by: org.postgresql.util.PSQLException: ERROR: column geocity0_.myorder не существует» – ciro

0

я отправляю альтернативное решение, используя родной запрос

public ArrayList<Autocomplete> autocomplete(String search, HttpSession httpSession, HttpServletRequest request) { 
    ArrayList<Autocomplete> autocomplete = new ArrayList<>(); 
    try{ 
     Query q = entityManager.createNativeQuery("SELECT istat,name,CASE WHEN LOWER(g.name) LIKE :search1 THEN 0 ELSE 1 END as myOrder FROM geo_city g WHERE (LOWER(g.name) LIKE :search) ORDER BY myOrder, g.name"); 
     q.setParameter("search","%" + search.toLowerCase() + "%"); 
     q.setParameter("search1",search.toLowerCase() + "%"); 
     List<Object[]> city = q.getResultList(); 
     if(city!=null && city.size()>0){ 
      for(Object[] o: city) { 
       autocomplete.add(new Autocomplete(o[0].toString(), o[1].toString())); 
      } 
     }else{ 
      autocomplete.add(new Autocomplete("","Nessun risultato!")); 
     } 
    }catch(Exception e){ 
     e.printStackTrace(); 
    } 

    return autocomplete; 
}