Hibernate多表查询处理

时间:2011-11-23 12:26:38

标签: hibernate

我有4张桌子

  1. 具有以下字段的标题,id(PK),Name,AuthorId(FK)& PublishedId(FK)
  2. 作者有id(FK),作者姓名&联系方式
  3. 发布者拥有,id(PK),发布者名称& RegionId(FK)
  4. 区域有,id(PK),地区名称,发布日期&已公布的费用。
  5. 现在在我看来,我接受了

    1. 作者姓名,我的代码看起来像

      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. 当我搜索姓名时,我得到了正确的结果,但是当我搜索我的作者姓名时,我需要在上面的代码中更改哪些内容?

      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:
      */
      

      有人可以帮忙吗?

2 个答案:

答案 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技术:对象/关系映射。我在你的问题中看到关系表,但没有提到对象。

我在模型中看到至少五个对象,可能更多:

  1. 标题
  2. 作者
  3. 出版商
  4. 区域
  5. ContactDetails
  6. 考虑这些对象之间的一对多和多对多关系。例如,作者可能会写几个标题;标题可能有几位作者。听起来像是一种互惠的多对多关系。

    所以对象可能如下所示:

    public class Author {
        private List<Title> titles;  // parent
    }
    
    public class Title {
        private List<Author> authors; // child
    }
    

    将它们映射为Hibernate中的1:m关系,它将帮助您生成SQL。你不会像你认为的那样需要HQL。

    实现多对多关系的另一种方法是将其“重新”化为单独的对象。您的设计选择,取决于哪些更好。如果您拥有最佳分离的属性,那么这是一个好主意。一个例子可能是学生和课程(学生需要很多课程;课程由许多学生参加)。将其重新定义为具有等级或其他类型对象的ReportCard可能是有意义的。