Hibernate非ID列的通用查询方法?

时间:2016-06-28 08:40:26

标签: hibernate hibernate-criteria

我一直致力于使用JAX-RS和Hibernate访问数据库的Java EE项目。到目前为止,我已经使用了hibernate的标准api来进行查询,并且我有一个很好的通用方法来从表中获取所有行。当我只查询表的一部分时出现问题。我有多个表,其中大多数都有自动生成的int id和字符串字段。通常,一些字符串字段对它们具有唯一约束。我必须根据这些字符串字段编写查询,这些字段必须是唯一的。到目前为止,我已经使用了这样的方法:( Service类是我的实体之一)

public Service getService(String serviceGroup, String serviceDefinition){
    Service service = new Service();

    Session session = getSessionFactory().openSession();
    Transaction transaction = null;

    try {
         transaction = session.beginTransaction();
         Criteria criteria = session.createCriteria(Service.class);
         criteria.add(Restrictions.eq("serviceGroup", serviceGroup));
         criteria.add(Restrictions.eq("serviceDefinition", serviceDefinition));
         service = (Service) criteria.uniqueResult();
         transaction.commit();
     }
     catch (Exception e) {
         if (transaction!=null) transaction.rollback();
         throw e;
     }
     finally {
         session.close();
     }

    return service;
}

我的问题是Restrictions的行包含硬编码字符串,这些字符串必须与我的实体类中的字段名称匹配。这有问题,因为我有越来越多的表。 (基本上我对每个表都有相同的方法)我怎么能像这个方法一样使用泛型查询方法呢?我有比标准api更好的选择吗?任何指向我的好方向都会很棒。

2 个答案:

答案 0 :(得分:1)

你可以做这样的事情

public Service getService(String serviceGroup, String serviceDefinition,Map<String,String> restrictionMap,Class queryClass ){
Service service = new Service();

Session session = getSessionFactory().openSession();
Transaction transaction = null;

try {
     transaction = session.beginTransaction();
     Criteria criteria = session.createCriteria(queryClass);
      if(null!=restrictionMap && !restrictionMap .isEmpty()){
       for(Entry<String,String> entry:restrictionMap.entrySet()){
        criteria.add(Restrictions.eq(entry.getKey(), entry.getValue());
     }
   }
     service = (Service) criteria.uniqueResult();
     transaction.commit();
 }
 catch (Exception e) {
     if (transaction!=null) transaction.rollback();
     throw e;
 }
 finally {
     session.close();
 }

return service;

}

限制图将具有类成员名称作为键,相应的值将作为地图中的值

答案 1 :(得分:0)

最终通用方法对我来说是这样的:

@SuppressWarnings("unchecked")
public <T> T get(Class<T> queryClass, Map<String, String> restrictionMap) {
    T object = null;

    Session session = getSessionFactory().openSession();
    Transaction transaction = null;

    try {
        transaction = session.beginTransaction();
        Criteria criteria = session.createCriteria(queryClass);
        if (null != restrictionMap && !restrictionMap.isEmpty()) {
            for (Entry<String, String> entry : restrictionMap.entrySet()) {
                criteria.add(Restrictions.eq(entry.getKey(), entry.getValue()));
            }
        }
        object = (T) criteria.uniqueResult();
        transaction.commit();
    } catch (Exception e) {
        if (transaction != null)
            transaction.rollback();
        throw e;
    } finally {
        session.close();
    }

    return object;
}