Java 一对多查询jpql
我是jpql的新手,我有以下情况 我有两个实体:地点和地址Java 一对多查询jpql,java,jpa,jpa-2.0,jpql,Java,Jpa,Jpa 2.0,Jpql,我是jpql的新手,我有以下情况 我有两个实体:地点和地址 @Entity public class Place{ @OneToMany private List<Address> addresses; .... } @Entity public class Address{ String description; Date dataFrom; Date dataTo; @ManyToOne private Pla
@Entity
public class Place{
@OneToMany
private List<Address> addresses;
....
}
@Entity
public class Address{
String description;
Date dataFrom;
Date dataTo;
@ManyToOne
private Place place;
....
}
现在我应该按时间顺序得到最后一个地址。
我该怎么办
SELECT addresses.description
FROM place p JOIN p.addresses addresses
ORDER BY addresses.dateFrom
然后将其作为结果列表返回,并获取列表中的第一项,我想说您可能可以像T-SQLSELECT TOP 1
中那样操作,但是,我认为JPQL不支持这一点
Criteria criteria = session.createCriteria(Place.class, "place");
criteria.createAlias("place.addresses", "addresses")
criteria.add(Order.desc("addresses.dataFrom"));
criteria.setProjection(Projections.property("addresses"));
List<Address> addresses = criteria.list();
for (Address address : addresses) {
System.out.println(address.description);
}
然后将其作为结果列表返回并获取列表上的第一项,我想说您可能可以像T-SQL中的一样选择Top1,但是,我不相信JPQL支持这一点。Criteria=session.createCriteria(Place.class,“Place”);
Criteria criteria = session.createCriteria(Place.class, "place");
criteria.createAlias("place.addresses", "addresses")
criteria.add(Order.desc("addresses.dataFrom"));
criteria.setProjection(Projections.property("addresses"));
List<Address> addresses = criteria.list();
for (Address address : addresses) {
System.out.println(address.description);
}
criteria.createAlias(“place.addresses”、“addresses”)
添加(Order.desc(“address.dataFrom”);
标准.setProjection(Projections.property(“addresses”));
列表地址=criteria.List();
收件人(地址:地址){
System.out.println(地址.说明);
}
如果您想根据地点id查找地址,请使用下面的地址
Criteria criteria = session.createCriteria(Place.class, "place");
criteria.add(Restrictions.eq("place.id", put the place id here);
criteria.createAlias("place.addresses", "addresses")
criteria.add(Order.desc("addresses.dataFrom"));
criteria.setProjection(Projections.property("addresses"));
List<Address> addresses = criteria.list();
for (Address address : addresses) {
System.out.println(address.description);
}
Criteria=session.createCriteria(Place.class,“Place”);
添加(Restrictions.eq(“place.id”),将place id放在这里);
criteria.createAlias(“place.addresses”、“addresses”)
添加(Order.desc(“address.dataFrom”);
标准.setProjection(Projections.property(“addresses”));
列表地址=criteria.List();
收件人(地址:地址){
System.out.println(地址.说明);
}
标准=session.createCriteria(Place.class,“Place”);
criteria.createAlias(“place.addresses”、“addresses”)
添加(Order.desc(“address.dataFrom”);
标准.setProjection(Projections.property(“addresses”));
列表地址=criteria.List();
收件人(地址:地址){
System.out.println(地址.说明);
}
如果您想根据地点id查找地址,请使用下面的地址
Criteria criteria = session.createCriteria(Place.class, "place");
criteria.add(Restrictions.eq("place.id", put the place id here);
criteria.createAlias("place.addresses", "addresses")
criteria.add(Order.desc("addresses.dataFrom"));
criteria.setProjection(Projections.property("addresses"));
List<Address> addresses = criteria.list();
for (Address address : addresses) {
System.out.println(address.description);
}
Criteria=session.createCriteria(Place.class,“Place”);
添加(Restrictions.eq(“place.id”),将place id放在这里);
criteria.createAlias(“place.addresses”、“addresses”)
添加(Order.desc(“address.dataFrom”);
标准.setProjection(Projections.property(“addresses”));
列表地址=criteria.List();
收件人(地址:地址){
System.out.println(地址.说明);
}
尝试使用子查询,例如
select a.description from place p join p.addresses a where a.dataFrom = (select max(address.dataFrom) from Address address where address.place = p)
尝试使用子查询,例如
select a.description from place p join p.addresses a where a.dataFrom = (select max(address.dataFrom) from Address address where address.place = p)
is Address类有对Place的引用。比如@Entity public class Address{Place}是的,如果你同意的话,我有一个双向关联添加的答案……否则请评论确切的要求。is Address类有对Place的引用。比如@Entity public class Address{Place}是的,我有一个双向关联的答案,如果你同意的话……否则请评论确切的要求。