package com.myboxcs.service.base;import java.util.LinkedHashMap;import javax.persistence.Entity;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;import com.myboxcs.bean.QueryResult;@Transactional
public abstract class Daosuppert implements DAO{
@PersistenceContext protected EntityManager em;

@Transactional(readOnly=true,propagation=Propagation.NOT_SUPPORTED)
public <T> QueryResult<T> getScrollData(Class<T> entityClass,
int firstindex, int maxresult, LinkedHashMap<String, String> orderby) {

return getScrollData(entityClass,firstindex,maxresult,null,null,orderby);
}
@Transactional(readOnly=true,propagation=Propagation.NOT_SUPPORTED)
public <T> QueryResult<T> getScrollData(Class<T> entityClass,
int firstindex, int maxresult) {
return getScrollData(entityClass,firstindex,maxresult,null,null,null);
}
@Transactional(readOnly=true,propagation=Propagation.NOT_SUPPORTED)
public <T> QueryResult<T> getScrollData(Class<T> entityClass) {
return getScrollData(entityClass,-1,-1);
}

@Transactional(readOnly=true,propagation=Propagation.NOT_SUPPORTED)
public <T> QueryResult<T> getScrollData(Class<T> entityClass,String wherejpql,Object[] queryParams) {
return getScrollData(entityClass,-1,-1,wherejpql,queryParams);
} @Transactional(readOnly=true,propagation=Propagation.NOT_SUPPORTED)
public <T> QueryResult<T> getScrollData(Class<T> entityClass,
int firstindex, int maxresult, String wherejpql,
Object[] queryParams) {
return getScrollData(entityClass,firstindex,maxresult,wherejpql,queryParams,null);
}

public <T> void delete(Class<T> entityClass,Object entityid) {

delete(entityClass, new Object[]{entityid});

} public <T> void delete(Class<T> entityClass,Object[] entityids) {
for(Object id:entityids){
em.remove(em.getReference(entityClass, id));
}
}
@Transactional(readOnly=true,propagation=Propagation.NOT_SUPPORTED)
public <T> T find(Class<T> entityClass, Object entityid) {
return em.find(entityClass, entityid);
} public void save(Object entity) {
em.persist(entity);

} public void update(Object entity) {
em.merge(entity);

}
@SuppressWarnings("unchecked")
@Transactional(readOnly=true,propagation=Propagation.NOT_SUPPORTED)
public <T> QueryResult<T> getScrollData(Class<T> entityClass,
int firstindex, int maxresult, String wherejpql, Object[] queryParams,LinkedHashMap<String, String> orderby) {
QueryResult qr=new QueryResult<T>();
String entityname =getEntityName(entityClass);
Query query = em.createQuery("select o from "+ entityname+" o "+(wherejpql==null? "": "where "+ wherejpql)+ buildOrderby(orderby));
setQueryParams(query,queryParams);
if(firstindex != -1 && maxresult !=-1)
{
query.setFirstResult(firstindex);
query.setMaxResults(maxresult);
}
qr.setResultlist(query.getResultList());
query =em.createQuery("select count(o) from "+ entityname+" o "+(wherejpql==null? "": "where "+ wherejpql));
setQueryParams(query,queryParams);
qr.setTotalrecord((Long)query.getSingleResult());

return qr;
}
protected void setQueryParams(Query query,Object[] queryParams)
{
if(queryParams!=null&&queryParams.length>0){
for(int i=0;i<queryParams.length;i++){
query.setParameter(i+1, queryParams[i]);
}
}

}
protected String buildOrderby(LinkedHashMap<String, String> orderby){
StringBuffer orderbyql=new StringBuffer("");
if(orderby!=null && orderby.size()>0){
orderbyql.append(" order by ");
for(String key : orderby.keySet()){
orderbyql.append("o.").append(key).append(" ").append(orderby.get(key)).append(",");
}
orderbyql.deleteCharAt(orderbyql.length()-1);
}
return orderbyql.toString();
}

protected <T> String getEntityName(Class<T> entityClass)
{
String entityname =entityClass.getSimpleName();
Entity entity =entityClass.getAnnotation(Entity.class);
if(entity.name()!=null &&!"".equals(entity.name()))
{
entityname=entity.name();

}
return entityname;
}}
我想在这里面添加一个 查找功能,比方说 就是 通过用户名就能查找到密码什么的, 自己弄了好久 总出错。 
哪位好人 帮我添加这个功能啊。

解决方案 »

  1.   

    public TblUser UserLogin(String password)
    {
    return entityManager.loadByKeys(TblUser.class, new String[] { "password" }, new Object[] {password});
    }
      

  2.   

    public class UserDao extends Daosuppert {
      public User findUser(String name){
        getScrollData(User.class,-1, -1, "where  name =?", new String{name},null) ;
      }
    }
      

  3.   

    public class UserDao extends Daosuppert {
      public User findUser(long userId){
      reutrn getScrollData(User.class,-1, -1, "where  userId=?", new String{userId},null) ;
      }
    }
      

  4.   

    这个问题呵呵。
    public class UserDao extends Daosuppert { 
      public User findUser(String name){ 
        getScrollData(User.class,-1, -1, "where  name =?", new String{name},null) ; 
      } 
    }
      

  5.   

    我也差不多是这样写,但是是错的啊。StringBuffer jpql = new StringBuffer();
    List<Object> params=new ArrayList<Object>();
    params.add(true);
    jpql.append(" where  username =?"+(params.size()+1));
    params.add(formbean.getUsername());
        userService.getScrollData(User.class, jpql.toString(), params.toArray());
      

  6.   


    public <T> QueryResult<T> findname(Class<T> entityClass,String username){
    //String entityname =getEntityName(entityClass);
    QueryResult qr=new QueryResult<T>();
    Query query = em.createQuery("select o from User o where username ="+username);
    qr.setTotalrecord((Long)query.getSingleResult());
    return qr;
    }
    我这样写 但是报错 org.hibernate.exception.SQLGrammarException: could not execute queryUnknown column 'zengaill' in 'where clause'