2013-08-14 2 views
0

Я хочу получить запрос, который выбирает всех родителей только с детьми, которые заполняют это условие. children.date = today. Целью является повышение производительности, мне не нужны дети других дней.Минус в запросе на спящий режим?

Query q = ss.createQuery("select p from Parent p where exists(from p.children c where c.date = :now)"); 
    q.setTimestamp("now", new DateTime().minusDays(1).toDate()); 
    qc=q.list(); 

Другой способ:

DateMidnight first = new DateMidnight(); //today at 00h00 00min 00 JodaTime 
    ss.createCriteria(Parent.class) 
     .createAlias("children", "c") 
     .add(Restrictions.between("c.date",first.toDate(), first.plus(14400000).toDate())) 
     .list(); 

родительский класс

@Entity 
public class Parent implements Serializable { 

private static final long serialVersionUID = 1L; 
    @Id 
    @GeneratedValue(strategy=GenerationType.TABLE) 
    private Integer id; 

    @OneToMany(cascade = {CascadeType.ALL},mappedBy = "parentId",fetch = FetchType.LAZY) 
    @Column(name="id_parent",nullable=true,unique = true) 
    @Cascade(value={org.hibernate.annotations.CascadeType.ALL,org.hibernate.annotations.CascadeType.SAVE_UPDATE,org.hibernate.annotations.CascadeType.DELETE,org.hibernate.annotations.CascadeType.REMOVE}) 
    private List<Child> children=new ArrayList<Child>(); 

и Child.class

@Entity 
public class Child implements Serializable{ 

private static final long serialVersionUID = 1L; 
@Id 
@GeneratedValue(strategy=GenerationType.TABLE) 
@Column(name = "childID", unique = true, nullable = false) 
private long childId1; 

private Date date; 

private String childId2; 

ответ

0

Если это поле является Отметка дату и время, измените свой запрос, чтобы вы запросили все данные между (дата 00:00:00 и дата 23:59:59), которые должны предоставить вам все данные, которые вы хотите получить

+0

Я попробовал и обновил сообщение !! Все еще не работает – Rollyng

+0

Что делать toDate()? Если ваш столбец является меткой времени (дата + ВРЕМЯ), то вашей проблемой может быть вызов toDate(), который выглядит так, как будто он возвращает дату, а не метку времени. – user743414

+0

Я использую PostGreSQL, а столбец - это метка времени, но ti работает с датой. Но я не понимаю, что я ищу еще. – Rollyng

0

В этом случае я бы использовал HQL с именем запрос с фильтрами Hibernate. http://docs.jboss.org/hibernate/orm/3.6/reference/en-US/html/filters.html

код Родитель станет чем-то вроде этого:

@OneToMany(cascade = {CascadeType.ALL},mappedBy = "parentId",fetch = FetchType.LAZY) 
    [...] 
    @Filter(name = "todayChildrenOnly", condition = "date = :now") 
    private List<Child> children=new ArrayList<Child>(); 

выше будут переведены в SQL условие соединения, а также внешнего ключа проверки (присоединиться к ... далее ...). Если «дата» является индексом детской таблицы, вы должны получить лучшие результаты.

Смежные вопросы