我有4张桌子
现在在我看来,我接受了
作者姓名,我的代码看起来像
SearchTemplate _tempTemplate = new SearchTemplate(); 标准标准= null;
if (rcValue.getOperator().equalsIgnoreCase("like")) {
criterion = Restrictions.like(rcValue.getDisplayName(), rcValue.getOperandValue());
} else if (rcValue.getOperator().equalsIgnoreCase("is")) {
criterion = Restrictions.eq(rcValue.getDisplayName(), rcValue.getOperandValue());
} else if (rcValue.getOperator().equalsIgnoreCase("not")) {
criterion = Restrictions.ne(rcValue.getDisplayName(), rcValue.getOperandValue());
}
_tempTemplate.addCriterion(criterion);
当我搜索姓名时,我得到了正确的结果,但是当我搜索我的作者姓名时,我需要在上面的代码中更改哪些内容?
2.当我搜索发布日期时,我需要更改什么,因为它是一个多表搜索,如果它的SQL我可以轻松编写它,但现在使用Hibernate并实现'SearchTemplate'
/*The SearchTemplate is used to pass search parameters to the DAO layer.
*
* By having all the search parameters in one place (the SearchTemplate),
* we prevents combinatory explosion of 'find' method signatures in the DAO/Service layer.
* This leads to more stable DAO/Service interfaces as you can add search parameters to the
* SearchTemplate without adding new methods to your interfaces.
*
* A SearchTemplate helps you drive your search in the following areas:
*/
有人可以帮忙吗?
答案 0 :(得分:2)
第一个问题:
您需要进行连接(假设根实体是标题):
criteria.createAlias("author", "author");
criteria.add(Restrictions.eq("author.name", authorName);
第二个问题:
同样的答案:你需要加入:
criteria.createAlias("publisher", "publisher");
criteria.createAlias("publisher.region", "region");
criteria.add(Restrictions.eq("region.publishedDate", someDate));
这个SearchTemplate是一个非常糟糕的主意,IMO。而不是像明确的合同那样有明确定义的方法,如:
List<Title> findTitlesWithName(String name)
List<Title> findTitlesPublishedBy(Long publisherId)
Title findLatestTitleFromAuthor(String authorId)
你将有一个方法
List<Title> findTitles(SearchTemplate criteria)
您必须在标准中加入什么?标准的类型是什么?该方法对这些标准有何作用?将采用哪种订购方式?将提取或延迟加载哪些相关实体?
find方法的“爆炸”是一件好事,因为每个find方法都有自己的契约,优化和目标。每个也可以进行单元测试。这是DAO的目标。如果没有这些方法,您可能还有一个独特的方法,例如
List find(String hql, Object[] arguments)
但我没有看到这样一个DAO的目标。
答案 1 :(得分:1)
Hibernate是一种ORM技术:对象/关系映射。我在你的问题中看到关系表,但没有提到对象。
我在模型中看到至少五个对象,可能更多:
考虑这些对象之间的一对多和多对多关系。例如,作者可能会写几个标题;标题可能有几位作者。听起来像是一种互惠的多对多关系。
所以对象可能如下所示:
public class Author {
private List<Title> titles; // parent
}
public class Title {
private List<Author> authors; // child
}
将它们映射为Hibernate中的1:m关系,它将帮助您生成SQL。你不会像你认为的那样需要HQL。
实现多对多关系的另一种方法是将其“重新”化为单独的对象。您的设计选择,取决于哪些更好。如果您拥有最佳分离的属性,那么这是一个好主意。一个例子可能是学生和课程(学生需要很多课程;课程由许多学生参加)。将其重新定义为具有等级或其他类型对象的ReportCard可能是有意义的。