Hibernate - findByProperty - 如何将它与不同类型一起使用

时间:2015-10-31 12:33:03

标签: java hibernate-criteria

我正在尝试编写搜索,使用Hibernate来搜索不同类型的变量。我有一个模特电影,有属性:标题,导演,流派,年。标题,导演,流派是字符串,年份是int。

在jsp文件中,我有一个选择,它将选择我想要搜索的属性,然后是一个文本输入,我输入属性值。所以它可以是例如:标题:一些标题,年份:2000等等。

我将这些值传递给控制器​​。现在,我在hibernate类中有这样的方法:

Select tblBook.BookId, MAX(tblBook.copies) - SUM(tblIssue.copies) as countOfAvailebleBooks
FROm tblBook
FULL join tblIssue
ON tblBook.BookId = tblIssue.BookId
WHERE tblIssue.ReturnDate >= '2015-10-12'AND tblIssue.IssueDate <= '2015-10-12'

public Movie findByProperty(String searchCriteria, String criteriaValue) {
    Criteria criteria = getCurrentSession().createCriteria(Movie.class);
    Movie movie = (Movie) criteria.add(Restrictions.eq(searchCriteria, criteriaValue)).uniqueResult();
    return movie; 
}

在控制器中:

public Movie findByProperty(String searchCriteria, String criteriaValue) {
    jdbcMovieDao.openCurrentSession();
    Movie entity = jdbcMovieDao.findByProperty(searchCriteria, criteriaValue);
    jdbcMovieDao.closeCurrentSession();
    return entity;
}

当我选择String属性时,它工作正常,但我也希望能够选择year作为标准。如果在这里,我可能会放一些,但我不想这样做 - 除非有更好的方法。谁能告诉我如何正确地做到这一点&#39;。请温柔,我是初学者。 :-)

2 个答案:

答案 0 :(得分:0)

我猜问题是那年是数字不是字符串吗?

我认为你可以让它与Restriction.sqlRestriction和CAST一起工作,所以&#34;数据库&#34; -side也会返回一个字符串......就像那样...(假设Oracle为DB)

Restrictions.sqlRestriction("CAST({alias}.propertyName as VARCHAR2(255)) = ?", criteraValue, Hibernate.STRING)

然而,你会在那里进行大量的巫术演员 我坚持使用ifs;)

另外,我不确定CAST是否会将varchar2强制转换为varchar2,或者是否会产生错误。

更好的解决方案是使用Hibernate元模型(http://hibernate.org/orm/tooling/)来确定属性类型但如果没有一些我不会工作,如果我害怕

答案 1 :(得分:0)

Restrictions.eq将Object作为第二个参数。只需替换&#34; String criteriaValue&#34;通过&#34;对象criteriaValue&#34;在findByProperty方法中,您应该能够在搜索中同时使用String和(autoboxed)int值。 当然,控制器必须传递一年的int值,而不是String。

您当前的实现还有其他问题,它将URL参数searchCriteria与Movie类字段的名称相关联,在Restrictions.eq的第一个参数中使用。 URL和模型之间的紧密耦合通常不是一个好主意。

恶意用户也可以以您不期望的方式使用您的网址,例如,通过使用searchCriteria = id和后续自然数字作为searchValue的后续查询,您很容易窃取整个电影数据库。

您可以为每种类型的搜索创建不同的控制器方法,这将使Spring在调用适当的控制器方法时自动将年份转换为int。这也会使您的Web界面和模型分离,例如,您可以更改URL语法而无需对应用程序进行重大重构。

或者,您可以使用四个参数创建一个控制器方法,并重构DAO以允许通过多个查询键进行搜索。

无论您要做什么,都不要将URL与模型字段名称联系起来,也不要使用String参数或String,具体取决于上下文。它永远不会在内部进行干净的设计,它可能会妨碍您对Web界面的任何未来RESTful描述(例如使用WADL),因为您无法以一致的方式在URL中指定一种criteriaValue类型。