Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/321.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

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 使用或条件而不是和条件连接列的注释_Java_Hibernate_Joincolumn_Or Condition - Fatal编程技术网

Java 使用或条件而不是和条件连接列的注释

Java 使用或条件而不是和条件连接列的注释,java,hibernate,joincolumn,or-condition,Java,Hibernate,Joincolumn,Or Condition,我有两个java类,Relation和Person,它们都存在于我的数据库中 人: @Entity @Table(name = "persons") public class Person { @Id @Column private int id; @Column private String name; @OneToMany(fetch = FetchType.EAGER) @JoinColumns({ @JoinCo

我有两个java类,
Relation
Person
,它们都存在于我的数据库中

人:

@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
}
每个人都有一个关系列表(或没有),当关系的子id或父id等于该人的id时,应将该关系添加到列表中

TL;博士: 当
relation.child\u id或relation.parent\u id=person.id
=>将关系添加到与此人的关系列表中时

我面临的问题是,此注释:

@JoinColumns({
            @JoinColumn(name = "child_id", referencedColumnName="id"),
            @JoinColumn(name = "parent_id", referencedColumnName="id")
        })
创建以下SQL(只是必要的部分):


Java Hibernate中生成SQL语句而不是的正确注释是什么?您可以使用
@FilterDef
@Filter
注释。

您可以使用的一些选项:

  • 数据库视图。创建为您进行自定义连接的视图,并将实体映射到该视图
  • 。我设法使它们只在多对一协会中起作用。然而,您可以将关联设置为双向的,并在
    关系
    实体中应用公式
  • 。这是一种Hibernate视图,适用于无法创建真实数据库视图或更改db模式以更好地适应实体模型结构的情况
  • 这个答案也会有帮助

    此外,您始终可以为奴隶和主人使用两个单独的关联:

    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;
        }
    }
    
    公共类人物{
    @独身癖
    @JoinColumn(name=“slave_id”),
    私人名单奴隶;
    @独身癖
    @JoinColumn(name=“master_id”),
    私人名单大师;
    公共关系{
    列表结果=新的ArrayList(从属);
    结果:addAll(masters);
    返回结果;
    }
    }
    

    但是,请记住,在一个查询中连接所有这些查询需要主查询和从查询之间的完全笛卡尔乘积。

    连接公式和子选择似乎都很有希望。但我不喜欢在这些注释中编写SQL,所以我一直在寻找适合这个问题的答案。@Fox在这种情况下,请查看我更新的答案。无论如何,没有专门为您的案例设计的注释;您必须使用一些变通方法。是的,我能够获取2个列表,但我希望编写更好、更干净的代码。我的代码与你的代码相似。难道没有一个注释可以立即执行此操作吗?@s不,没有这样的注释。
    relations relations6_ 
                on this_.id=relations6_.slave_id 
                and this_.id=relations6_.master_id
    
    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;
        }
    }