【JPA】@queryパラメータが不確定なクエリーには適用されず、EntityManagerを使用

1359 ワード

最近のプロジェクトでは、Daoのコードを簡略化するためにJPAを使用してDaoを書き、Daoのインタフェースメソッドで@Queryコメントを使用して、実装クラス(Impl)をもう1つ書く必要はありません.例:
public interface IUserDao extends JpaRepository,
  JpaSpecificationExecutor {
  
  //  ID  
  @Query(value = "select t from User t where t.id = ?1  order by t.code")
  List 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);
}

プロジェクトでは、パラメータが不確定な場合があります.例えば、Webページのあいまいなクエリーでは、「キーワード」が空である可能性があります.この場合、Daoで@queryを使うのは不便です.
解決方法:EntityManagerで
@PersistenceContext
private EntityManager em; //  EntityManager 
public List 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 list = query.getResultList();
  return list;
}

訂正します:2018-06-12 queryはEntityManagerで作成したQuery=em.createQuery(sql)であるべきです