我在我的dao中有这个查询
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无效。但我需要在查询中使用case,以便以特定的方式进行排序。有什么办法吗?
发布于 2016-12-12 12:56:43
这是因为您的声明是transient。
public transient Integer myOrder; // this is transient尝试删除transient。
public Integer myOrder;并删除方法中的注释@Transient。
瞬态意味着,你声明的变量是而不是 serializable,这就是为什么它在hibernate中是一个无效的输入。单击此链接可查看中的更多信息。
发布于 2016-12-14 23:44:52
我发布了使用原生查询的替代解决方案
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;
}https://stackoverflow.com/questions/41091012
复制相似问题