Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Hibernate:投影多对多关系的特定列_Java_Hibernate_Many To Many_Projection_Hibernate Criteria - Fatal编程技术网

Java Hibernate:投影多对多关系的特定列

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")

我需要一些关于Hibernate投影和标准API的帮助。当我在两个实体(具有双向多对多映射)中包含字段时,我只从根实体获得结果

我定义了一名
员工

@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();