easy-query icon indicating copy to clipboard operation
easy-query copied to clipboard

【请求支持】请求 one2one 支持带中间表的 nav

Open link2fun opened this issue 1 year ago • 2 comments

现状 a().b().c() b是个没什么意义的中间表, 但是目前的数据结构又改不了

请求支持 oneToOne 能像 ManyToMany 一样 用上中间表

最终达成 a().c()

使用上和 ManyToMany 保持一致 只是类型变成 oneToOne

link2fun avatar Feb 26 '25 09:02 link2fun

2.5.18 已经实现 在原有的XTonOne的属性基础上使用directMapping来直接映射属性路径即可


@Data
@Table("direct1")
@EntityProxy
public class Direct1 implements ProxyEntityAvailable<Direct1 , Direct1Proxy> {
    @Column(primaryKey = true)
    private String c1;
    private String c2;
    private String c3;
    private String c4;
    private String c5;

    @Navigate(value = RelationTypeEnum.OneToOne, selfProperty = {Direct1Proxy.Fields.c1}, targetProperty = {Direct2Proxy.Fields.c7})
    private Direct2 direct2;


    @Navigate(value = RelationTypeEnum.ManyToOne,directMapping = {"direct2","direct3","direct4"})
    private Direct4 direct4;

    @Navigate(value = RelationTypeEnum.ManyToOne,directMapping = {"direct2","direct3","direct4","direct5"})
    private Direct5 direct5;
}


@Data
@Table("direct2")
@EntityProxy
public class Direct2 implements ProxyEntityAvailable<Direct2, Direct2Proxy> {
    @Column(primaryKey = true)
    private String c6;
    private String c7;
    private String c8;
    private String c9;
    private String c10;

    @Navigate(value = RelationTypeEnum.ManyToOne,
            selfProperty = {Direct2Proxy.Fields.c8, Direct2Proxy.Fields.c9},
            targetProperty = {Direct3Proxy.Fields.c13, Direct3Proxy.Fields.c14})
    private Direct3 direct3;
}


@Data
@Table("direct3")
@EntityProxy
public class Direct3 implements ProxyEntityAvailable<Direct3, Direct3Proxy> {
    @Column(primaryKey = true)
    private String c11;
    private String c12;
    private String c13;
    private String c14;
    private String c15;

    @Navigate(value = RelationTypeEnum.ManyToOne, selfProperty = {Direct3Proxy.Fields.c15}, targetProperty = {Direct4Proxy.Fields.c20})
    private Direct4 direct4;
}


@Data
@Table("direct4")
@EntityProxy
public class Direct4 implements ProxyEntityAvailable<Direct4, Direct4Proxy> {
    @Column(primaryKey = true)
    private String c16;
    private String c17;
    private String c18;
    private String c19;
    private String c20;

    @Navigate(value = RelationTypeEnum.OneToOne, selfProperty = {Direct4Proxy.Fields.c16, Direct4Proxy.Fields.c18}, targetProperty = {Direct5Proxy.Fields.c22, Direct5Proxy.Fields.c21})
    private Direct5 direct5;
}


@Data
@Table("direct5")
@EntityProxy
public class Direct5 implements ProxyEntityAvailable<Direct5, Direct5Proxy> {
    @Column(primaryKey = true)
    private String c21;
    private String c22;
    private String c23;
    private String c24;
    private String c25;
}




List<Direct1> list = easyEntityQuery.queryable(Direct1.class)
        .include(d -> d.direct4())
        .toList();


List<Direct1> list = easyEntityQuery.queryable(Direct1.class)
        .where(d -> {
            d.direct4().c16().eq("123");
            d.direct5().c21().eq("1234");
        })
        .toList();



SELECT
    t.`c1`,
    t.`c2`,
    t.`c3`,
    t.`c4`,
    t.`c5` 
FROM
    `direct1` t 
LEFT JOIN
    `direct2` t1 
        ON t1.`c7` = t.`c1` 
LEFT JOIN
    `direct3` t2 
        ON (
            t2.`c13` = t1.`c8` 
            AND t2.`c14` = t1.`c9`
        ) 
LEFT JOIN
    `direct4` t3 
        ON t3.`c20` = t2.`c15` 
LEFT JOIN
    `direct5` t4 
        ON (
            t4.`c22` = t3.`c16` 
            AND t4.`c21` = t3.`c18`
        ) 
WHERE
    t3.`c16` = '123' 
    AND t4.`c21` = '1234'

xuejmnet avatar Mar 03 '25 00:03 xuejmnet

希望添加OneToOne或ManyToOne使用mappingClass的版本,提供两种选择

rocascent avatar Mar 10 '25 02:03 rocascent