HybernateのSQLQueryとQueryのプレースホルダを参照してください。


HybernateはSQLQuery(特定のデータベースプラットフォームに関するsql文)とQuery(hql)の照会方法をサポートしています。もちろんCriteriaオブジェクトの照会方法もあります。本文ではSQLQueryとQueryのいくつかの方法と注意事項を紹介します。
SQLQuery
1、照会結果はmapにマッピングされます。:param参照
public List> findMapBySql(String sql, Map params) {
      SQLQuery sqlQuery = this.getCurrentSession().createSQLQuery(sql);
      sqlQuery=getSqlQueryByMap(sqlQuery,params);
      return sqlQuery.setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP).list();
    } 

public SQLQuery getSqlQueryByMap(SQLQuery sqlQuery,Map params){
        if (params != null && !params.isEmpty()) {
            for (String key : params.keySet()) {
                Object obj = params.get(key);
                if (obj instanceof Collection>)
                    sqlQuery.setParameterList(key, (Collection>) obj);
                else if (obj instanceof Object[])
                    sqlQuery.setParameterList(key, (Object[]) obj);
                else
                    sqlQuery.setParameter(key, obj);

            }
        }
        return sqlQuery;
    }
戻ってきたデータは、mapタイプのリストです。パラメータは、mapを介して渡されます。パラメータの種類は、paramです。
呼び出しの例:
String sql="select id,user_name,create_date_time from tbl_user where code=:code"
Map<String,Object> params=new HashMap<>();
params.put("code","test");
List<Map<String,Object>> users=this.findMapBySql(sql,params);
実体に転化する集合が必要なら、自分で処理する必要があります。
2、照会結果はエンティティにマッピングされます。:param転送参
 public  List find(String sql, Map params, Class clazz) {

        SQLQuery query = this.getCurrentSession().createSQLQuery(sql);
        query=getSqlQueryByMap(query,params);
        query.setResultTransformer(Transformers.aliasToBean(clazz));
        return query.list();
    }
リターンされたデータはエンティティのリストであり、パラメータはmapを通じて伝達され、パラメータのタイプは:paramであり、データベースフィールドはマッピングされたエンティティフィールドと一対一に対応しなければならず、またgetter/setter方法があります。そうでなければエラーが発生します。
呼び出しの例:
String sql="select id,user_name,create_date_time from tbl_user where code=:code"
Map<String,Object> params=new HashMap<>();
params.put("code","test");
List<User> users=this.find(sql,params,User.class);
User本体にはuser_が必要です。name、create_date_timeの属性定義は、userNameではなく、createDateTimeであり、もちろん別名を制定することによって解決できます。
また、次のような方法で、エンティティリストを取得することもできます。
   public  List findBySql(String sql, Class<T> clazz) {

        SQLQuery sqlQuery = this.getCurrentSession().createSQLQuery(sql);
        sqlQuery.addEntity(clazz);
        return sqlQuery.list();
    }
同様にエンティティリストを取得する場合、以下の方法は、データベースフィールド名に対応するエンティティ属性名、例えばsql->user_を検索することである。nameは、entity->userNameにマッピングされます。@Transientのエンティティは、値を与えられません。対応するクエリ結果は、entityに注入されません。
3、クエリの結果は、mapまたはエンティティにマッピングされますか?参を回す
  public List findMapBySql(String sql, Object[] params, Type[] types, Class clazz) {

        SQLQuery query = this.getCurrentSession().createSQLQuery(sql);
        if (clazz != null) {
            query.setResultTransformer(Transformers.aliasToBean(clazz));
        } else {
            query.setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP);
        }
        query.setParameters(params, types);
        return query.list();
    }
戻ってきたデータはリストであり、clazzパラメータに基づいて、戻ってきたmapタイプのリストか、それともエンティティリストかを判断し、パラメータはプレースホルダを使用しています。
呼び出しの例:
String sql="select id,user_name,create_date_time from tbl_user where code like ? and id in (?,?,?)"
Object[] params=new Object[]{"%test%",1,3,5};
Type[] types=new Type[]{Hibernate.String,Hibernate,Integer,Hibernate.Integer,Hibernate.Integer};
ListString,Object>> users=this.findMapBySql(sql,params,types,null);
Query
HQL文でデータを調べたら、検索結果もSQLQueryタイプと同じです。
  • は、setsResult Transformerをサポートし、クエリ結果をエンティティリストまたはmapリスト
  • にマッピングする。
  • は、set Parameters(?参)
  • を介してサポートされている。
  • setParameeter/set Param引数List(:param传参)
  • は、addEntityがエンティティーにマッピングされることをサポートしていない(hql本明細書はエンティティーと結合されているので)

  • また、HiberanteクエリはCriteriaとExampleの2つの方法をサポートしています。