我有一个类,需要使用Hibernate从DB检索.问题是我的班级有多个成员,其中大多数是班级,我该如何检索它们?
@Entity
public class Student {
@Id
long id;
String name;
String fname;
@OneToMany
List<Course> courses;
@ManyToOne
Dealer dealer;
...
}
@Entity
public class Dealer {
@Id
long id;
String name;
@OneToMany(fetch = FetchType.LAZY, mappedBy = "cr.dealer", cascade = CascadeType.ALL)
Set<Car> cars = new HashSet<Cars>(0);
..
}
Run Code Online (Sandbox Code Playgroud)
我需要检索学生ID 1及其所有课程,经销商和经销商汽车列表.
我的预测如下,但它不会返回任何内容.
...
.setProjection(Projections.projectionList()
.add(Projections.property("friends.cars").as("cars")
...
Run Code Online (Sandbox Code Playgroud) 过去几周我一直在使用spring和hibernate,我一直在那里学习新东西.
现在我有一个问题,我想用Hibernate中的Projections来解决.
假设有一个模型Person,该模型有很多Car.以下是类定义大致如下所示:
public class Person implements java.io.Serializable {
private Integer id;
private String name;
private List<Car> cars;
private Integer minYear; // Transient
private Integer maxYear; // Transient
}
public class Car implements java.io.Serializable {
private Integer id;
private Integer year;
}
Run Code Online (Sandbox Code Playgroud)
这里的问题是我希望得到每个人的minYear(maxYear)Person最早的年份(最近一年)cars.
后来我找到了一个使用的解决方案,Projections但我偶然发现org.hibernate.QueryException: could not resolve property: minYear of: model.Person,这是db操作的代码:
Criteria criteria = sessionFactory.getCurrentSession().createCriteria("model.Person");
criteria.add(create(personInstance));
criteria.createAlias("minYear", "minYear");
criteria.setProjection(Projections.min("cars.year").as("minYear"));
Run Code Online (Sandbox Code Playgroud)
无论如何都要将聚合值存储在transient方法中,Projections因为我只想尽可能避免使用普通的SQL和HQL.
使用以下代码,我可以成功检索用户的地址字段,为此我需要使用 Projection 定义其所有字段。想象一下 address 有 100 个字段,在这种情况下,我必须定义所有字段。
我想知道是否可以只返回客户的地址对象而无需在 Proposition 中定义其所有字段?
我知道我可以检索地址的 id 并使用它来检索它的对象,但我想知道是否还有其他方法而不是这个方法或定义它的所有字段。
休眠
.....
Criteria cre = session.createCriteria(User.class, "user")
.createAlias("user.address", "addr");
cre.add(Restrictions.eq("user.id", ID));
ProjectionList pl = Projections.projectionList();
pl.add(Projections.property("addr.id").as("id"));
pl.add(Projections.property("addr.unit").as("unit"));
.......
cre.setProjection(pl);
Address address = (Address) cre.list().get(0);
Run Code Online (Sandbox Code Playgroud)
我也使用了以下内容,但遇到了错误(无法解析属性:com.myProject.User 的地址)
pl.add(Projections.property("addr").as("address"));
Run Code Online (Sandbox Code Playgroud)
爪哇
@Entity
public Class User {
@Id
@GeneratedValue
private long id;
@OneToOne
private Address address;
...
}
Run Code Online (Sandbox Code Playgroud) 在问题29980421中,我发现答案中的代码示例包括PropertyAccessor和PropertyAccessorFactory.当我检查hibernate-orm项目时,我发现这些类已被删除:
org.hibernate.property.PropertyAccessor在2015-06-04 15:12:17 GMT-04:00 org.hibernate.property.PropertyAccessorFactory在2015-06-04 15:12:17 GMT-04:00删除
有人会对此提出任何反馈意见吗?
如果可能,您是否会提供一个运行示例,替换问题29980421中第一个答案中的代码示例? 如何使用Hibernate检索一组成员对象?
编辑:
感谢您的评论.阅读评论后,我从问题中删除了hibernate 4.x. PropertyAccessorFactory怎么样?