我一直致力于使用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更好的选择吗?任何指向我的好方向都会很棒。
答案 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;
}