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;
4

2 回答 2

0

如果该字段是时间戳日期和时间,请更改您的查询,以便查询(日期 00:00:00 和日期 23:59:59)之间的所有数据,这些数据应该为您提供所需的所有数据

于 2013-08-14T08:57:14.347 回答
0

在这种情况下,我将使用带有 Hibernate 过滤器的 HQL 命名查询。 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 连接条件以及外键检查(join ... on ...)中进行翻译。如果“日期”是子表的索引,你应该得到更好的性能。

于 2013-08-14T09:23:16.700 回答