非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;
}
我一直致力于 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;
}