使用hibernate和spring MVC
通过id查询到一个用户,但是只返回指定的字段
方式一: 拼接hql
/***
* 通过数据库ID查询用户,但是只返回指定的字段
* @param id
* @param propertyNames : 指定的多个成员变量
* @return
*/
public Object[] getPropertiesById(int id,String[] propertyNames){
if(ValueWidget.isNullOrEmpty(propertyNames)){
return null;
}
String hql="select "+propertyNames[0];
for (int i = 1; i < propertyNames.length; i++) {
String string = propertyNames[i];
hql+=","+string;
}
String parameterId="id22";
hql+=" from "+clz.getCanonicalName()+" c where c.id=:"+parameterId;
Query q= this.sessionFactory.getCurrentSession().createQuery(hql);
Object result=q.setInteger(parameterId, id).uniqueResult();
Object[]objs=null;
if(result instanceof Object[]){
objs=(Object[])result;
}else{//当只返回一个成员变量的时候
objs=new Object[]{result};
}
return objs;
}
/***
* 通过id,查询到一条记录,但是只返回指定的两个字段
* @param id
* @param propertyName1 : 类的成员变量
* @param propertyName2 : 类的成员变量
* @return
*/
public Object[] getPropertiesById(int id,String propertyName1,String propertyName2){
String hql="select "+propertyName1;
if(!ValueWidget.isNullOrEmpty(propertyName2)){
hql+=","+propertyName2;
}
String parameterId="id22";
hql+=" from "+clz.getCanonicalName()+" c where c.id=:"+parameterId;
Query q= this.sessionFactory.getCurrentSession().createQuery(hql);
Object result=q.setInteger(parameterId, id).uniqueResult();
Object[]objs=null;
if(result instanceof Object[]){
objs=(Object[])result;
}else{//当只返回一个成员变量的时候
objs=new Object[]{result};
}
return objs;
}
方式二:使用投影
/***
* 通过数据库ID查询用户,但是只返回指定的字段
* @param id
* @param propertyNames : 指定的多个成员变量
* @return
*/
public Object[] getPropertiesById2(int id,String[] propertyNames){
Criteria c=this.sessionFactory.getCurrentSession().createCriteria(clz);
ProjectionList projectionList=Projections.projectionList();
if(!ValueWidget.isNullOrEmpty(propertyNames)){
for (int i = 0; i < propertyNames.length; i++) {
String string = propertyNames[i];
projectionList.add(Projections.property(string));
}
}
Object result=c.add(Restrictions.idEq(id)).setProjection(projectionList).uniqueResult();
Object[]objs=null;
if(result instanceof Object[]){
objs=(Object[])result;
}else{//当只返回一个成员变量的时候
objs=new Object[]{result};
}
return objs;
}
/***
* 通过id,查询到一条记录,但是只返回指定的两个字段
* @param id
* @param propertyName1 : 类的成员变量
* @param propertyName2 : 类的成员变量
* @return
*/
public Object[] getPropertiesById2(int id,String propertyName1,String propertyName2){
Criteria c=this.sessionFactory.getCurrentSession().createCriteria(clz);
ProjectionList projectionList=Projections.projectionList()
.add(Projections.property(propertyName1));
if(!ValueWidget.isNullOrEmpty(propertyName2)){
projectionList.add(Projections.property(propertyName2));
}
Object result=c.add(Restrictions.idEq(id)).setProjection(projectionList).uniqueResult();
Object[]objs=null;
if(result instanceof Object[]){
objs=(Object[])result;
}else{//当只返回一个成员变量的时候
objs=new Object[]{result};
}
return objs;
}
使用场景:知道id,但是没必要获取整条记录,只需要获取其中的两三个字段而已.