最近做的项目,为了简化Dao的代码,使用了JPA来写Dao,Dao的接口方法上使用@Query注释,不需要再写一个实现类(Impl)。
例子:
public interface IUserDao extends JpaRepository<User, String>,
JpaSpecificationExecutor<User> {
//根据ID查询
@Query(value = "select t from User t where t.id = ?1 order by t.code")
List<User> getListById(String id);
//根据ID更新NAME
@Modifying
@Query(value = "update User t set t.name= ?2 where t.id = ?1")
void updateNameById(String id , String name);
}
在项目中,遇到一种情况,就是参数不确定的,例如网页上的模糊查询,“关键字”有可能是空的,这时候在Dao用@query就不方便了。
解决方法:用EntityManager
@PersistenceContext
private EntityManager em; //注入EntityManager
public List<User> getUserList(String keyword){
//构建Query,注意用的是HQL语法
String sql = " from User t where 1=1 ";
if(StringUtil.isNotNull(keyword)){//判断keyword是否为空
sql += " and t.name like ?1 "; //根据下标
//sql += "and t.name like :name "; //根据属性
}
//Query query = new Query(sql);
Query query = em.createQuery(sql);// 这里做个更正
query.setParameter(1,keyword); //根据下标
//query.setParameter(name ,keyword); //根据属性
//查询
List<User > list = query.getResultList();
return list;
}
做个更正:
2018-06-12 query应该是用EntityManager创建的 Query query = em.createQuery(sql)