Java 将条件转换为自联接的分离条件

Java 将条件转换为自联接的分离条件,java,hibernate,self-join,detachedcriteria,Java,Hibernate,Self Join,Detachedcriteria,我想知道是否可以将此标准转换为分离的标准。我没有正确理解分离的标准。有人能帮忙吗 Criteria crit = sessionC.createCriteria(OP_DOCTOR_VISIT.class, "OPDV1"); crit.createAlias("OPDV1.OP_VISIT", "OPDV2", JoinType.LEFT_OUTER_JOIN, Restrictions.and(Restrictions.eq("OPDV2.FORM", "NEW"), Restriction

我想知道是否可以将此标准转换为分离的标准。我没有正确理解分离的标准。有人能帮忙吗

Criteria crit = sessionC.createCriteria(OP_DOCTOR_VISIT.class, "OPDV1");
crit.createAlias("OPDV1.OP_VISIT", "OPDV2", JoinType.LEFT_OUTER_JOIN, Restrictions.and(Restrictions.eq("OPDV2.FORM", "NEW"), Restrictions.ge("OPDV2.USER_DATETIME", fromdate), Restrictions.le("OPDV2.USER_DATETIME", todate)));
    crit.add(Restrictions.ge("OPDV1.USER_DATETIME", fromdate));
    crit.add(Restrictions.le("OPDV1.USER_DATETIME", todate));
    ProjectionList p1 = Projections.projectionList();
    p1.add(Projections.alias(Projections.count("OPDV1.OP_VISIT_ID"), "TOTAL"));
    p1.add(Projections.count("OPDV2.FORM"));
    p1.add(Projections.alias(Projections.sqlGroupProjection("date(this_.USER_DATETIME) as createdDate", "createdDate", new String[]{"createdDate"}, new Type[]{StandardBasicTypes.DATE}), "DAT"));
    crit.setProjection(p1);
是否可以重写上面的内容,这样我就可以避免在下面给出的POJO中使用“@OneToMany”

波乔

@实体
@表(name=“OP_医生就诊”)
@SQLDelete(sql=“UPDATE OP\u DOCTOR\u VISIT SET DELETED='DELETED'其中OP\u VISIT\u ID=?和VERSION\u UPDATES=?”)
@其中(子句=“已删除”“已删除”“)
公共类OP_DOCTOR_访问实现可序列化{
@身份证
@GeneratedValue(策略=GenerationType.IDENTITY)
@列(name=“OP\u VISIT\u ID”)
私人长期访问ID;
@OneToMany(mappedBy=“OP\u VISIT\u ID”,cascade=CascadeType.ALL,fetch=FetchType.LAZY)
@LazyCollection(LazyCollectionOption.EXTRA)
@Fetch(FetchMode.SELECT)
私人名单开放参观;
公众长期访问ID(){
返回操作访问ID;
}
公共无效设置访问ID(长访问ID){
this.OP_VISIT_ID=OP_VISIT_ID;
}
公共列表getOP_访问(){
回访;
}
公共无效访问(列表访问){
this.OP_VISIT=OP_VISIT;
}
}

仅在创建criteria对象的第一行

  • DetachedCriteria
    允许您在没有会话的情况下创建查询。因此,在生成查询时不需要会话
    DetachedCriteria
    与条件相同,只是您可以在不使用会话的情况下创建查询

    DetachedCriteria DetachedCriteria=DetachedCriteria.forClass(OP_DOCTOR_VISIT.class)

  • 最后,当会话对象可用时,可以执行查询

    `条件。getExecutableCriteria(会话)


  • 仅显示创建criteria对象的第一行

  • DetachedCriteria
    允许您在没有会话的情况下创建查询。因此,在生成查询时不需要会话
    DetachedCriteria
    与条件相同,只是您可以在不使用会话的情况下创建查询

    DetachedCriteria DetachedCriteria=DetachedCriteria.forClass(OP_DOCTOR_VISIT.class)

  • 最后,当会话对象可用时,可以执行查询

    `条件。getExecutableCriteria(会话)

  • DetachedCriteria crit=DetachedCriteria.forClass(OP_DOCTOR_VISIT.class,“OPDV1”)

    分离的条件允许您在没有会话的情况下创建查询。然后可以在任意会话中执行搜索

    事实上,当使用分离的标准使用另一个或新的会话时,您应该仔细考虑(没有缓存和会话的创建)

    它们对于生成一些联接条件、子选择以及在当前会话之外进行查询非常有用。 另一个常见用途是代码重用

    如果您使用Spring并选择使用HibernateTemplate,则它不提供createCriteria()方法。 您只能找到**DetachedCriteria。DetachedCriteria crit=DetachedCriteria.forClass(OP_DOCTOR\u VISIT.class,“OPDV1”)

    分离的条件允许您在没有会话的情况下创建查询。然后可以在任意会话中执行搜索

    事实上,当使用分离的标准使用另一个或新的会话时,您应该仔细考虑(没有缓存和会话的创建)

    它们对于生成一些联接条件、子选择以及在当前会话之外进行查询非常有用。 另一个常见用途是代码重用

    如果您使用Spring并选择使用HibernateTemplate,则它不提供createCriteria()方法。
    您只能找到**分离标准。

    请您解释一下第二句话。“事实上,当使用分离的条件使用另一个或新的会话(无缓存和会话的创建)时,您应该仔细考虑。”DetachedCriteria不使用任何会话。因此,不要将其与会话使用/链接。例如。没有可用的缓存。总是提前加载。请解释第二句话。“事实上,当使用分离的条件使用另一个或新的会话(无缓存和会话的创建)时,您应该仔细考虑。”DetachedCriteria不使用任何会话。因此,不要将其与会话使用/链接。例如。没有可用的缓存。总是提前加载。
    @Entity
    @Table(name = "OP_DOCTOR_VISIT")
    @SQLDelete(sql = "UPDATE OP_DOCTOR_VISIT SET DELETED = 'DELETED' WHERE OP_VISIT_ID = ? and VERSION_UPDATES = ?")
    @Where(clause = "DELETED <> 'DELETED'")
    public class OP_DOCTOR_VISIT implements Serializable {
    
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "OP_VISIT_ID")
    private Long OP_VISIT_ID;
    
    @OneToMany(mappedBy = "OP_VISIT_ID", cascade = CascadeType.ALL, fetch = FetchType.LAZY)
    @LazyCollection(LazyCollectionOption.EXTRA)
    @Fetch(FetchMode.SELECT)
    private List<OP_DOCTOR_VISIT> OP_VISIT;
    
        public Long getOP_VISIT_ID() {
            return OP_VISIT_ID;
        }
    
        public void setOP_VISIT_ID(Long OP_VISIT_ID) {
            this.OP_VISIT_ID = OP_VISIT_ID;
        }
    
        public List<OP_DOCTOR_VISIT> getOP_VISIT() {
            return OP_VISIT;
        }
    
        public void setOP_VISIT(List<OP_DOCTOR_VISIT> OP_VISIT) {
            this.OP_VISIT = OP_VISIT;
        }
    
    }