【问题标题】:Hibernate CreateCriteria for dependent class依赖类的休眠 CreateCriteria
【发布时间】:2019-01-31 12:11:13
【问题描述】:

我正在开发一个应用程序,我必须在其中显示有关车辆详细信息的数据/信息。我有 2 个表 makemodel,其中 make_idmodel 表中的外键。我有 2 个实体类 MakeModel 如下所示:

@Entity
@Table(name = "make")
@PrimaryKeyJoinColumn(name="make_id")
public class Make {
    @Id
    @Column(name = "make_id")
    private String makeId;

    @Column(name = "make_name")
    private String makeName;

    @ManyToOne
    @JoinColumn(name = "mfg_unit_id")
    private MfgUnit mfgUnit;

    // Getter and Setters
}


@Entity
@Table(name = "model")
public class Model {
    @Id
    @Column(name = "model_id")
    private String modelId;

    @Column(name = "model_creation_date")
    private Date modelCreationDate;

    @Column(name = "make_id")
    private long makeId;

    @ManyToOne
    @JoinColumn(name = "make_id")
    private Make make;

    // Getter and Setters
}

我能够检索所有Makes,但我的要求是仅检索model_creation_date 介于今天和过去30 天之间的Makes。任何人都可以帮助我如何为此建立 Hibernate 标准吗?

【问题讨论】:

    标签: java hibernate hibernate-criteria


    【解决方案1】:

    可能有另一种解决方案,但要实现这一点,您需要修改 Make 类,如下所示引入与 Model 类的新关系 (@OneToMany):

    @Entity
    @Table(name = "make")
    @PrimaryKeyJoinColumn(name="make_id")
    public class Make {
        @Id
        @Column(name = "make_id")
        private String makeId;
    
        @Column(name = "make_name")
        private String makeName;
    
        // ** introduced new relationship **
        @OneToMany(mappedBy="make", fetch = FetchType.LAZY)
        private List<Model> models;
    
        @ManyToOne
        @JoinColumn(name = "mfg_unit_id")
        private MfgUnit mfgUnit;
    
        // Getter and Setters
    }
    
    

    并保持“模型”类原样:

    @Entity
    @Table(name = "model")
    public class Model {
        @Id
        @Column(name = "model_id")
        private String modelId;
    
        // change the datatype as Date or similar Datatype
        @Column(name = "model_creation_date")
        private Date modelCreationDate;
    
        @Column(name = "make_id")
        private long makeId;
    
        @ManyToOne
        @JoinColumn(name = "make_id")
        private Make make;
    
        // Getter and Setters
    }
    

    一旦您与“Make”中的“Model”建立了关系,您就可以执行以下代码来获取结果:

    Calendar cal = Calendar.getInstance();
    // today 
    Date toDate=cal.getTime(); 
    cal.add( Calendar.DATE, -30 );
    //date before 30 days
    Date fromDate=cal.getTime();
    
    
    Criteria criteria = session.createCriteria(Make.class , "m")
            .createAlias("models", "s")
            .add(Restrictions.between("s.modelCreationDate",  fromDate, toDate))
            // if the above condition dosen't give you exact result you may try following(2)
            // try gt or lt ... as needed 
            //.add(Restrictions.ge("publicationDate", fromDate)) 
            //.add(Restrictions.le("publicationDate", fromDate))
            .setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);
    
    List<Make> ll2 = criteria.list();
    
    

    【讨论】:

      【解决方案2】:

      对不起,我不知道你为什么将日期声明为字符串:

      私有字符串模型创建日期;

      无论如何,我假设您将 modelCreationDate 声明为 Date/LocalDate 或类似的类型。我还没有测试过代码,但我希望下面的代码能解决你的问题。祝你好运!

      Calendar cal = Calendar.getInstance();
      // today 
      Date toDate=cal.getTime(); 
      cal.add( Calendar.DATE, -30 );
      //date before 30 days
      Date fromDate=cal.getTime();
      
      
      Criteria criteria = session.createCriteria(Model.class , "s")
              .createAlias("make", "m")
              .add(Restrictions.between("s.modelCreationDate",  fromDate, toDate))
              // if the above condition dosen't give you exact result you may try following(2)
              // try gt or lt ... as needed 
              //.add(Restrictions.ge("publicationDate", fromDate)) 
              //.add(Restrictions.le("publicationDate", fromDate))
              .setProjection(
                      Projections.projectionList()
                      .add(Projections.groupProperty("m.makeId").as("makeId"))
                      .add(Projections.property("m.makeName").as("makeName")) 
                  )
              .setResultTransformer(Transformers.aliasToBean(Make.class));
      
      
      List<Make> ll2 = criteria.list();
      
      

      【讨论】:

      • 您好@user3169715,感谢您的回复。我在Make 类中也有多个@ManyToOne 连接。我刚刚在我的问题中列出了几个属性。我现在已经编辑了我的问题,以显示其他 @ManyToOne 列的示例。那么,有没有一种方法可以在不使用投影和选择单个列的情况下实现这一点,因为我希望像 Hibernate 默认情况下那样自动填充所有细节?
      • 嗨@Prasann,看看下面的答案。
      • 嗨@user3169715,有你想发布的链接吗?谢谢
      【解决方案3】:

      除了user3169715's answer,我还可以使用查询检索记录

      Calendar cal = Calendar.getInstance();
      Date toDate = cal.getTime();
      cal.add(Calendar.DATE, -30);
      Date fromDate = cal.getTime();
      
      String hql = "SELECT make FROM Model m where m.modelCreationDate between :from_date and :to_date";
      Query query = session.createQuery(hql);
      query.setParameter("from_date", fromDate);
      query.setParameter("to_date", toDate);
      
      List results = query.list(); // Result list
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-10-26
        • 1970-01-01
        • 1970-01-01
        • 2019-08-12
        • 2017-08-03
        • 1970-01-01
        • 1970-01-01
        • 2013-09-11
        相关资源
        最近更新 更多