Hibernate CreateCriteria для зависимого класса - PullRequest
0 голосов
/ 31 января 2019

Я работаю над приложением, в котором я должен отображать данные / информацию об автомобиле.У меня есть 2 таблицы make и model с make_id в качестве внешнего ключа в таблице model.У меня есть 2 класса сущностей Make и Model, как показано ниже:

@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
}

Я могу получить все Make s, но мое требование - только Make s длякоторый model_creation_date находится между сегодняшним днем ​​и последними 30 днями.Может ли кто-нибудь помочь мне, как построить критерии Hibernate для этого?

Ответы [ 3 ]

0 голосов
/ 08 февраля 2019

может быть другое решение, но для достижения этого вам нужно изменить класс Make следующим образом, вводя новое отношение (@OneToMany) с классом Model:

@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
}

И сохраняйте класс Model.как есть:

@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
}

Когда у вас есть связь с 'Model' из 'Make', вы можете выполнить следующий код, чтобы получить свой результат:

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();

0 голосов
/ 14 февраля 2019

Альтернатива ответа пользователя user3169715 , я также могу получить записи, используя запрос

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
0 голосов
/ 31 января 2019

Извините, я понятия не имею, почему вы объявили дату как String:

private String modelCreationDate;

В любом случае, я предполагаю, что вы объявите 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();

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...