休眠,检查对象是不是存在和空值

Posted

技术标签:

【中文标题】休眠,检查对象是不是存在和空值【英文标题】:hibernate, check if object exists and null values休眠,检查对象是否存在和空值 【发布时间】:2015-07-20 11:56:29 【问题描述】:

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

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

生成的查询应如下所示:

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

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

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

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

【问题讨论】:

一个简单的解决方案是在你的数据库中为 column1-3 的组合添加唯一约束。这样,您将不会被允许将重复项自动添加到 db。但是如果你有多个记录可以包含这些列的空值的场景,这将不起作用。 WHERE ((column1 is null AND :column1Param is null) OR column1=:column1Param ) AND (column2 相同...) ? 也许您可以创建列的校验和并将其另存为单独的列 - 即使列将为空,校验和也将具有值(例如“null,null,null”),而不是在其上创建索引,您将必须计算新对象的校验和并仅检查此列 @Waqar 我同意应该有约束作为保障。无可否认。但我不相信依赖异常是一个好主意。在 java 中抛出异常是一项昂贵的操作,因此依赖异常通常是不好的做法。 【参考方案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&lt;Criterion&gt; 构建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&lt;Criterion&gt;) 会很好)。

【讨论】:

以上是关于休眠,检查对象是不是存在和空值的主要内容,如果未能解决你的问题,请参考以下文章

以Java 8方式检查对象中包含的空对象和空值

如何检查线程是不是处于休眠状态?

localStorage 区分不存在的键和空值

实体上的休眠预设ID,无法使其持续存在

休眠保存或更新行为

使用休眠检查数据库表中某些记录的最快方法[关闭]