Java 在hibernate中使用注释实现静态联接

Java 在hibernate中使用注释实现静态联接,java,hibernate,join,annotations,Java,Hibernate,Join,Annotations,我对冬眠比较陌生,不知道是否有人能帮我。 虽然在hibernate中使用@JoinColumns标记在多个列上实现正常连接没有问题,但在注释中尝试实现以下查询时,我遇到了难题: @JoinColumns SELECT A.* FROM TABLEA A LEFT OUTER JOIN TABLEB B ON A.UID = B.ID AND B.NAME = 'JAY' 从表A中选择一个* 左外连接表B 在A.UID=B.ID上 和B.NAME='JAY' 正如您所看到的,连接也是基于一个不是列

我对冬眠比较陌生,不知道是否有人能帮我。 虽然在hibernate中使用@JoinColumns标记在多个列上实现正常连接没有问题,但在注释中尝试实现以下查询时,我遇到了难题:

@JoinColumns SELECT A.* FROM TABLEA A LEFT OUTER JOIN TABLEB B ON A.UID = B.ID AND B.NAME = 'JAY' 从表A中选择一个* 左外连接表B 在A.UID=B.ID上 和B.NAME='JAY' 正如您所看到的,连接也是基于一个不是列的值(“JAY”)。我不知道如何在注释中进行这种映射

有人能帮忙吗

谢谢,
Jay

您不需要将b.name指定为连接条件。相反,只需将其指定为where子句的一部分

SELECT A.* 
FROM TABLEA A 
LEFT OUTER 
JOIN TABLEB B ON A.UID = B.ID 
WHERE B.NAME is null or B.NAME = 'JAY'

您不需要将b.name指定为联接条件。相反,只需将其指定为where子句的一部分

SELECT A.* 
FROM TABLEA A 
LEFT OUTER 
JOIN TABLEB B ON A.UID = B.ID 
WHERE B.NAME is null or B.NAME = 'JAY'

您的问题不清楚您是否试图将其映射为HQL查询或关联

我假设您正在谈论一个查询,
TABLEA
TABLEB
之间的关联已经通过
a.UID
B.ID
列映射。在这种情况下,您可以使用以下命令编写查询:


如果这不是您想要的,请澄清您的问题。

您的问题不清楚您是否试图将其映射为HQL查询或关联

我假设您正在谈论一个查询,
TABLEA
TABLEB
之间的关联已经通过
a.UID
B.ID
列映射。在这种情况下,您可以使用以下命令编写查询:


如果这不是你想要的,请澄清你的问题。

这不是同一个问题。如果所需的联接是内部联接,而不是左外部联接,则可能是相同的查询。这仍然是错误的,除非b.name被约束为不可为null,因为它将从b返回name为null的行;原来的查询不会,我不明白。如果它是一个内部连接,那么表b中的可空值将不会返回。。。但若它是一个左外部联接,那个么将返回表2中可为null的结果。你似乎暗示了第三种选择。它既不是内部连接也不是外部连接。不,我是在“暗示”在“左连接…打开…”和“WHERE…”子句中指定条件之间有区别;在“WHERE”中添加“OR…IS NULL”没有帮助。这并不重要——OP已经在问题中指定了SQL查询;我不太清楚你为什么要用另一种形式重写它,但我认为这不是他要求的。这不是同一个问题。如果所需的联接是内部联接,而不是左外部联接,则可能是相同的查询。这仍然是错误的,除非b.name被约束为不可为null,因为它将从b返回name为null的行;原来的查询不会,我不明白。如果它是一个内部连接,那么表b中的可空值将不会返回。。。但若它是一个左外部联接,那个么将返回表2中可为null的结果。你似乎暗示了第三种选择。它既不是内部连接也不是外部连接。不,我是在“暗示”在“左连接…打开…”和“WHERE…”子句中指定条件之间有区别;在“WHERE”中添加“OR…IS NULL”没有帮助。这并不重要——OP已经在问题中指定了SQL查询;我不太清楚你为什么要用另一种形式重写它,但我认为这不是他想要的。嗨,Chyss,我正在使用Criteria API,因为我需要一个动态查询。表之间的关联如问题中所定义,仅在ID列上进行连接是不够的。虽然在注释中设置单列联接非常简单:@JoinColumn(name=“UID”,referencedColumnName=“ID”),但我不知道如何添加第二个联接约束。Hibernate上下文中的“关联”表示“映射定义的实体之间的关联”。您将无法将查询转换为关联定义;核心Hibernate允许您使用公式()来实现这一点,但它相当混乱;不过,没有JPA/annotations的对应版本。您将无法使用条件编写上述查询,因为除了“with”之外别无选择。非常感谢,所以我唯一的选择是HQL或命名查询?(如果我选择不使用公式,即。)这里使用HQL的唯一方法是使用
A.UID
B.ID
映射
TableA
TableB
,然后使用上述查询-命名或临时。您可以在不映射关联的情况下执行命名SQL。您可以使用该命名sql查询为集合()指定自定义加载程序,但这只适用于直接向上的集合加载;不是作为更大查询的一部分。虽然我还没有尝试过,但我认为Hibernate筛选器可能是解决方案。嗨,Chyss,我正在使用Criteria API,因为我需要一个动态查询。表之间的关联如问题中所定义,仅在ID列上进行连接是不够的。虽然在注释中设置单列联接非常简单:@JoinColumn(name=“UID”,referencedColumnName=“ID”),但我不知道如何添加第二个联接约束。Hibernate上下文中的“关联”表示“映射定义的实体之间的关联”。您将无法将查询转换为关联定义;核心Hibernate允许您使用公式()来实现这一点,但它相当混乱;不过,没有JPA/annotations的对应版本。您将无法使用条件编写上述查询,因为除了“with”之外别无选择。非常感谢,所以我唯一的选择是HQL或命名查询?(如果我选择不使用公式,即。)这里使用HQL的唯一方法是使用
A.UID
B.ID
映射
TableA
TableB
,然后使用上述查询-命名或临时。您可以在不映射关联的情况下执行命名SQL。你