hibernate,检查对象是否存在以及null值

时间:2015-07-20 11:56:30

标签: java hibernate h2

我正在使用hibernate将记录(即对象)保存到数据库中。在保存对象之前,我想验证数据库是否已包含此对象。 (主键只是一个增量键,不能用于此。)

在运行时创建一个HQL语句来检查具有这些属性的记录的存在性(即column1-3)。

生成的查询应如下所示:

from myTable where column1 is null and column2 = :column2 and column3 = :column3'

因为有时列可以包含空值,我检查属性的值,如果它是NULL值,那么我使用is而不是{{1}在此查询中(例如上述语句中的=)。

因为我开始意识到我正在做很多工作来实现至关重要的事情,所以我开始怀疑自己是否走在正确的轨道上。 有没有更简单的方法来检查对象的存在?

编辑: 在我意识到同时 column1 is :column1在{{{}后无法正常工作时,我略微改写了我的问题1}}参数设置为column1 is :column1。显然,唯一似乎按预期工作的语法是:column1。因此,在搜索null值时,您似乎无法使用通配符。但这并没有改变我的问题的主要方面:我应该在运行时检查所有这些东西吗?

1 个答案:

答案 0 :(得分:1)

这是我到目前为止找到的最佳方式。

我更喜欢将过滤器放在地图中。键指的是属性(即map.put("column1", Integer.valueOf(1)))。

有一种Restritions.eqOrIsNull方法可以简化向Criterion对象的转化。以下方法将整个Map转换为List<Criterion>

public List<Criterion> mapToCriterion(Map<String, Object> params)
{
  if (params == null) return null;

  // convert the parameter map to a list of criterion
  List<Criterion> criterionList = new ArrayList<>(params.size());
  for (Map.Entry<String, Object> entry : params.entrySet())
    criterionList.add(Restrictions.eqOrIsNull(entry.getKey(), entry.getValue()));
  return criterionList;
}

稍后,我使用List<Criterion>构建Criteria对象。

 Criteria criteria = session.createCriteria(clazz);
 if (criterionList != null)
 {
   for(Criterion criterion : criterionList) 
     criteria.add(criterion);
 }

 // get the full list
 @SuppressWarnings("unchecked")
 List<T> objectList = criteria.list();

我的总体印象仍然是这里缺少一些便利方法(例如Criteria#addAll(List<Criterion>)本来不错)。