Java Hibernate:投影多对多关系的特定列
我需要一些关于Hibernate投影和标准API的帮助。当我在两个实体(具有双向多对多映射)中包含字段时,我只从根实体获得结果 我定义了一名Java Hibernate:投影多对多关系的特定列,java,hibernate,many-to-many,projection,hibernate-criteria,Java,Hibernate,Many To Many,Projection,Hibernate Criteria,我需要一些关于Hibernate投影和标准API的帮助。当我在两个实体(具有双向多对多映射)中包含字段时,我只从根实体获得结果 我定义了一名员工 @Entity @Table(name="EMPLOYEE") public class Employee { @Id @Column(name="EMPLOYEE_ID") @GeneratedValue private Long employeeId; @Column(name="FIRSTNAME")
员工
@Entity
@Table(name="EMPLOYEE")
public class Employee {
@Id
@Column(name="EMPLOYEE_ID")
@GeneratedValue
private Long employeeId;
@Column(name="FIRSTNAME")
private String firstname;
@Column(name="LASTNAME")
private String lastname;
@ManyToMany(fetch = FetchType.EAGER , cascade = {CascadeType.ALL})
@JoinTable(name="EMPLOYEE_MEETING",
joinColumns={@JoinColumn(name="EMPLOYEE_ID")},
inverseJoinColumns={@JoinColumn(name="MEETING_ID")})
private Set<Meeting> meetings = new HashSet<Meeting>();
public Employee() {
}
public Employee(String firstname, String lastname) {
this.firstname = firstname;
this.lastname = lastname;
}
...
他们的schema
createtableemployee(
员工id序列号,
firstname VARCHAR(50)NULL默认为NULL,
lastname VARCHAR(50)NULL默认为NULL,
主键(员工id)
);
创建表会议(
会议编号:,
subject VARCHAR(50)不为空,
会议日期不为空,
主键(会议id)
);
创建员工会议表(
员工id BIGINT不为空,
会议id BIGINT不为空,
主键(员工id、会议id),
约束FK_员工外键(员工id)引用员工(员工id),
约束FK会议外键(会议id)引用会议(会议id)
);
我想得到一份具有会议属性的员工的扁平列表
没有where子句
Meeting meeting1 = new Meeting("Quaterly Status meeting");
Meeting meeting2 = new Meeting("Weekly Status meeting");
Meeting meeting3 = new Meeting("daily Status meeting");
Employee employee1 = new Employee("Gingerly", "Brint");
Employee employee2 = new Employee("Mary", "Kate");
employee1.getMeetings().add(meeting1);
employee1.getMeetings().add(meeting2);
employee2.getMeetings().add(meeting1);
employee2.getMeetings().add(meeting3);
meeting1.getEmployees().add(employee1);
meeting1.getEmployees().add(employee2);
meeting2.getEmployees().add(employee1);
meeting3.getEmployees().add(employee2);
session.save(employee1);
session.save(employee2);
Criteria criteria = session.createCriteria(Employee.class, "e");
criteria.setFetchMode("e.meetings", FetchMode.JOIN);
criteria = criteria.createAlias("e.meetings", "m", JoinType.LEFT_OUTER_JOIN);
final ProjectionList projections = Projections.projectionList()
.add(Projections.property("e.firstname"))
.add(Projections.property("m.subject"))
;
criteria.setProjection(projections);
final List<Object> list = criteria.list();
当我指定投影时,我只得到Employee表的列的结果。下面的查询示例
选择
此名为y0,m1。主题为y1_
从…起
雇员本_
左外连接
员工会议3在本次会议上。员工ID=会议3。员工ID
左外连接
在会议3上召开m1会议。会议ID=m1会议ID;
即使SQL查询包含关于主题的投影,我也没有得到这样的结果
您需要完整的源代码
任何帮助都将不胜感激
谢谢
Meeting meeting1 = new Meeting("Quaterly Status meeting");
Meeting meeting2 = new Meeting("Weekly Status meeting");
Meeting meeting3 = new Meeting("daily Status meeting");
Employee employee1 = new Employee("Gingerly", "Brint");
Employee employee2 = new Employee("Mary", "Kate");
employee1.getMeetings().add(meeting1);
employee1.getMeetings().add(meeting2);
employee2.getMeetings().add(meeting1);
employee2.getMeetings().add(meeting3);
meeting1.getEmployees().add(employee1);
meeting1.getEmployees().add(employee2);
meeting2.getEmployees().add(employee1);
meeting3.getEmployees().add(employee2);
session.save(employee1);
session.save(employee2);
Criteria criteria = session.createCriteria(Employee.class, "e");
criteria.setFetchMode("e.meetings", FetchMode.JOIN);
criteria = criteria.createAlias("e.meetings", "m", JoinType.LEFT_OUTER_JOIN);
final ProjectionList projections = Projections.projectionList()
.add(Projections.property("e.firstname"))
.add(Projections.property("m.subject"))
;
criteria.setProjection(projections);
final List<Object> list = criteria.list();