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

Hibernate generic query method for non-ID columns?

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

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 的行具有硬编码字符串,这些字符串必须与我的实体 classes 中的字段名称相匹配。随着我的 table 越来越多,这越来越成问题了。 (基本上我对每个 table 都有相同的方法)我怎样才能使通用查询方法 像这个方法一样发挥作用?我有比标准 api 更好的选择吗?任何指向我好的方向都会很棒。

你可以这样做

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;

}

限制映射将class成员名称作为键,对应的值作为映射中的值

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

@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;
}