当前位置: 首页 > 面试题库 >

使用OR条件而不是AND条件连接列的注释

竺绍辉
2023-03-14
问题内容

我有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
}

每个人都有(或没有)关系列表,当关系的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中正确的注释是什么,以生成一条用 OR* 代替 AND 的SQL语句 *


问题答案:

您可以利用的一些选项:

  1. 数据库视图。创建为您执行自定义联接的视图,然后将实体映射到该视图。
  2. 加入公式。我设法使它们仅在多对一关联中起作用。但是,您可以使关联双向,并在Relation实体中应用公式。
  3. @Subselect。这是一种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;
    }
}

但是,请记住,将它们全部合并到一个查询中需要在主服务器和从服务器之间使用完整的笛卡尔积。



 类似资料:
  • 问题内容: 我的ActiveRecord模型中有以下查询方法: 因此,这将查找所有具有从逗号分隔的列表中获取的标签并转换为数组的标签的记录。 目前,这会匹配带有ANY匹配标签的记录-如何使其在匹配所有标签的地方工作。 IE:如果当前如果我输入:“ blue,red”,那么我将获得所有标记为blue或red的记录。 我想匹配所有标有蓝色和红色的记录。 有什么建议吗? - 编辑 - 我的模型是这样的:

  • 我看过一些代码,其中人们使用了带有两个“!”的条件子句s 这是我能找到的一些例子。 使用有什么好处超过?

  • 问题内容: 当前试图用a编写select语句,并且搜索条件使我有些悲痛。 目的是搜索具有3种不同参数类型的表,并相应地对输出进行排名。(下面是我的代码示例) 关键搜索条件(必须且加权为1) 其他必备(加权.8) 很高兴(加权.5) SQL: 上面的语句不返回任何内容,我怀疑它是否有可能以上述方式堆叠术语。 返回的结果必须同时拥有会计和经理,并且很高兴拥有Excel 有什么建议可以实现这一目标吗?

  • 我试图左加入2表,而使用mysql"不在"条件。我的问题是,如果左连接是null,这意味着没有条目左连接,mysql不是在操作符不能正常工作。 这里有一个例子。 因为类型表中当前没有匹配的行。NOT IN操作员不工作。有什么解决办法吗?

  • 我正在使用Ingres 11.0 DB,不确定它是否在其他数据库引擎上具有相同的行为,但这里是它 它不会返回表1中的所有记录,但我使用的是左连接,它应该从T1返回aa记录,从t2只处理行,只返回1条记录 如果我将其中一个条件从where子句移动到join条件,它的开始将返回我所期望的结果 问题是为什么它不工作在哪里所有搜索条件在哪里子句,但工作时,我移动t2.id_number从哪里加入条件? 我

  • 问题内容: 我想知道Java(或更普遍的是:在编程中)的一些情况,在布尔表达式中首选使用无条件()而不是有条件版本()。 我知道它们是如何工作的,但是我想不出使用单曲值得的情况。 问题答案: 我发现在现实生活中的情况下,表达的双方都真的很便宜,所以它剃掉了一两纳秒避免分支,使用无条件代替。(不过,这些都是极高性能的数学实用程序;我几乎永远不会在其他代码中使用它,并且如果没有详尽的基准测试来证明它更