我正在使用 hibernate 将记录(即对象)保存到数据库中。在保存我的对象之前,我想验证数据库是否已经包含这个对象。(主键只是一个增量键,不能用于此目的。)
我正在运行时创建一个 HQL 语句来检查具有这些属性的记录的存在(即column1-3)。
结果查询应如下所示:
from myTable where column1 is null and column2 = :column2 and column3 = :column3'
Run Code Online (Sandbox Code Playgroud)
因为有时列可以包含空值,我检查属性的值,如果它是空值,那么我在这个查询中使用 ais而不是 a =(例如column1 is :column1在上面的语句中)。
因为我开始意识到我正在做很多工作来实现一些相对重要的事情,我开始怀疑我是否在正确的轨道上。有没有更简单的方法来检查对象的存在?
编辑:我稍微改写我的问题后,我意识到,也 column1 is :column1当不工作:column1参数设置为null。显然,似乎按预期工作的唯一语法是column1 is null. 因此,似乎您在搜索null值时不能使用通配符。但这并没有改变我问题的主要方面:我真的应该在运行时检查所有这些东西吗?
这是迄今为止我发现的最好的方法。
我更喜欢将过滤器放在地图中。键指的是属性(即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;
}
Run Code Online (Sandbox Code Playgroud)
后来,我使用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();
Run Code Online (Sandbox Code Playgroud)
我的总体印象仍然是这里缺少一些方便的方法(例如本来Criteria#addAll(List<Criterion>)就很好)。
| 归档时间: |
|
| 查看次数: |
5259 次 |
| 最近记录: |