【问题标题】:criteria for @OneToMany association@OneToMany 关联的标准
【发布时间】:2013-08-30 00:22:43
【问题描述】:

Student 类与 Resume 类型的 Object 具有 OneToOne 关联,Resume 类与 Master 类型的集合具有 OneToMany 关联,而 master 具有属性 degreeName。 我想要实现的是:

选择 student.resume.masters.degreeName 在 (?,?,?,.....) 中的所有学生

它应该在所有集合(主)对象中搜索。

以下代码没有编译错误,但没有给出预期的结果,请纠正我。

学生单位:

 @Entity
 public class Student {
      @OneToOne(fetch = FetchType.LAZY, mappedBy = "student", cascade = CascadeType.ALL)
      private Resume resume;
   }  

简历实体:

@Entity
public class Resume {
     @OneToMany(mappedBy="resume",cascade=CascadeType.ALL)
     private List<Master> masters=new ArrayList<>();
     @OneToOne(fetch=FetchType.LAZY)
     @PrimaryKeyJoinColumn
     private Student student;
   }  

主实体:

@Entity
public class Master {
   @Id
   @GeneratedValue(strategy=GenerationType.AUTO)
   private int id;
   @ManyToOne(fetch=FetchType.LAZY)
   @JoinColumn(name="resume_id")
   private Resume resume;
   private String degreeName;
}

道:

    Criteria studentCriteria = session.createCriteria(Student.class);
    Criteria resumeCriteria = studentCriteria.createCriteria("resume");
    Criteria mastersCriteria = resumeCriteria.createCriteria("masters");
    List<String> degreeslist = new ArrayList<>(Arrays.asList(degrees));
    //degreeList is collection of values on which the student will be searched

    if (degreeslist.size() == 1) {
        mastersCriteria.add(Restrictions.eq("degreeName",
                degreeslist.get(0)));
    } else {

        mastersCriteria.add(Restrictions.in("degreeName", degreeslist));
      }

【问题讨论】:

    标签: java hibernate


    【解决方案1】:
        Criteria mastersCriteria = getSession().createCriteria(Student.class, "student");
        mastersCriteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);    
        mastersCriteria.createAlias("student.resume", "resume"); 
        mastersCriteria.createAlias("resume.masters","masters");
    
        if (degreeslist.size() == 1) {
              mastersCriteria.add(Restrictions.eq("masters.degreeName", degreeslist.get(0)));  
        } else {
              mastersCriteria.add(Restrictions.in("masters.degreeName", degreeslist));
        }
    
    
        List<Student> students = mastersCriteria.list();
    

    【讨论】:

    • 它工作得非常好,谢谢。但我仍然没有找到我错的地方。
    • 您正在为每个模型创建单独的标准,但我正在为每个模型创建标准的别名
    • 同意........我们如何在相同条件的两个别名之间放置逻辑 OR/AND 运算符。
    猜你喜欢
    • 1970-01-01
    • 2017-09-19
    • 1970-01-01
    • 2014-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-30
    • 1970-01-01
    相关资源
    最近更新 更多