【问题标题】:Annotation to join columns with OR condition instead of AND condition使用 OR 条件而不是 AND 条件连接列的注释
【发布时间】:2016-04-05 09:48:42
【问题描述】:

我有 2 个 java 类,RelationPerson,它们都存在于我的数据库中。

人:

@Entity
@Table(name = "persons")
public class Person {
    @Id
    @Column
    private int id;

    @Column
    private String name;

    @OneToMany(fetch = FetchType.EAGER)
    @JoinColumns({
        @JoinColumn(name = "slave_id", referencedColumnName="id"),
        @JoinColumn(name = "master_id", referencedColumnName="id")
    })
    private List<Relation> relations;

    //Getters and setters
}

关系:

@Entity
@Table(name = "relations")
public class Relation {
    @Id
    @Column
    private int id;

    @Column
    private int child_id;

    @Column
    private int parent_id;

    @Column
    private String type;

    //Getters and setters
}

每个 Person 都有一个关系列表(或没有),当关系的 child_id 或 parent_id 等于该人的 id 时,应将关系添加到列表中。

TL;DR: 当relation.child_id OR relation.parent_id = person.id => 将关系添加到与人的关系列表中

我面临的问题是这个注释:

@JoinColumns({
            @JoinColumn(name = "child_id", referencedColumnName="id"),
            @JoinColumn(name = "parent_id", referencedColumnName="id")
        })

创建以下 SQL(只是必要的部分):

relations relations6_ 
            on this_.id=relations6_.slave_id 
            and this_.id=relations6_.master_id

在 Java Hibernate 中生成 SQL 语句的正确注解是 OR 而不是 AND

【问题讨论】:

    标签: java hibernate joincolumn or-condition


    【解决方案1】:

    您可以使用的一些选项:

    1. 数据库视图。创建为您执行自定义连接的视图并将实体映射到视图。
    2. Join formula。我设法让它们只在多对一关联上工作。不过,您可以将关联设为双向并在 Relation 实体中应用公式。
    3. @Subselect。这是一种 Hibernate 视图,适用于无法创建真正的数据库视图或更改数据库架构以更好地适应实体模型结构的情况。

    Thisthis 的回答也可能会有所帮助。

    此外,您始终可以为从属和主控使用两个单独的关联:

    public class Person {
        @OneToMany
        @JoinColumn(name = "slave_id"),
        private List<Relation> slaves;
    
        @OneToMany
        @JoinColumn(name = "master_id"),
        private List<Relation> masters;
    
        public List<Relation> getRelations() {
            List<Relation> result = new ArrayList<>(slaves);
            result.addAll(masters);
            return result;
        }
    }
    

    但是,请记住,将它们全部连接到一个查询中需要主从之间的完整笛卡尔积。

    【讨论】:

    • Join formula 和 Subselect 看起来很有希望。但我宁愿不喜欢在这些注解中写 SQL,所以我一直在寻找适合这个问题的答案。
    • @STheFox 在这种情况下,请查看我的更新答案。无论如何,没有专门为您的案例设计的注释;您将不得不使用一些解决方法。
    • 是的,我能够获取 2 个列表,但我希望编写更好、更简洁的代码。我的代码与您的代码相似。不是有注解可以一次性做到吗?
    • @STheFox 不,没有这样的注释。
    【解决方案2】:

    您可以使用@FilterDef@Filter 注释。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-07
      • 2016-04-21
      • 1970-01-01
      • 2016-04-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-10
      相关资源
      最近更新 更多