hibernate参数列表

时间:2011-06-21 08:51:55

标签: hibernate

我需要编写一个处理查询的通用函数。 函数get List<String>保存发送到query的参数。 我如何在hibernate中实现它。

更具体地说,如果我的查询是:

select * from people where name=:name and family=:family

我的列表将包含

<"name","myname">
<"family","myfamily">

5 个答案:

答案 0 :(得分:1)

getHibernateTemplate()最有可能返回一个org.springframework.orm.hibernate3.HibernateTemplate,它是spring框架中的Hibernate助手类。这是其中调用的find方法的代码:

    public List find(final String queryString, final Object[] values) throws DataAccessException {
    return (List) executeWithNativeSession(new HibernateCallback() {
        public Object doInHibernate(Session session) throws HibernateException {
            Query queryObject = session.createQuery(queryString);
            prepareQuery(queryObject);
            if (values != null) {
                for (int i = 0; i < values.length; i++) {
                    queryObject.setParameter(i, values[i]);
                }
            }
            return queryObject.list();
        }
    });
}

答案 1 :(得分:0)

查看Hibernate Criteria API

这应该让你开始。

答案 2 :(得分:0)

将查询写为:

String str="select * from people where name=? and family=?";
List<Object> queryParam=new ArrayList<Object>();
queryParam.add(name); //queryParam.add(yourList.get(0));
queryParam.add(family); //queryParam.add(yourList.get(1));
List<Object[]> List=getHibernateTemplate().find(str,queryParam.toArray());

答案 3 :(得分:0)

如果我正确地阅读了您的问题,您需要一种通用方法来调用使用命名参数的查询,并传入包含要绑定的名称/值对的列表。

这很简单。为了清晰起见,我省略了泛型的使用。

    String query="select p from Person p where name=:name and family=:family";
    String[] parameterArray = new String[] {"name", "myName", "family","myFamily"}; 
    List parameters = Arrays.asList(parameterArray);
    List results = callQuery(session, query, parameters);

public List callQuery(Session session, String query, List parameters) {
      Query query = session.createQuery(query);
      if (parameters != null && !parameters.isEmpty()) {
          for (int i = 0; i < parameters.size(); i+=2) {
            query.setParameter(parameters[i],parameters[i+1]);
          }
      }
      return query.list();
    }

另一种方法是使用Map,它使迭代参数将它们添加到查询中更加清晰;我还发现它将它们添加到集合中以传递给泛型方法更清晰:

    String query="select p from Person p where name=:name and family=:family";
    Map<String,Object> parameters = new HashMap<String,Object>();
    parameters.put("name","myName");
    parameters.put("family,"myFamily");
    List results = callQuery(session, query, parameters);

public List callQuery(Session session, String query, Map<String,Object> parameters) {
      Query query = session.createQuery(query);
      if (parameters != null && !parameters.isEmpty()) {
          for (Map.Entry<String,Object> entry : parameters) {
            query.setParameter(entry.getKey(),entry.getValue());
          }
      }
      return query.list();
    }

我还建议在使用内联字符串时查看NamedQueries,因为它们允许您在映射xml / annotations中包含查询并添加一些查询语法验证。

答案 4 :(得分:0)

您可以使用参数列表在查询中包含“IN”和“setParameterList”

List<String> yourListString = new ArrayList<String>();

Query query = getSession().createQuery("select * from people where name in (:yourListString) and family in (:yourListString)"
query.setParameterList("yourListString ", yourListString);
query.executeUpdate();