【发布时间】:2020-05-02 06:45:28
【问题描述】:
我需要使用一个数据库,其中包含一些自定义外键的 2 个表。它将在特定条件下引用一个字段,否则将引用另一个字段。
如何使用 Hibernate 对此进行注释?
这是表格。
--------------------------- ---------------------------
| customer | | address |
--------------------------- ---------------------------
| - id | | - address_code |
| address_code | | - customer_id |
| primary_language_code | | - language_code |
| secondary_language_code | | ... |
| ... | | |
--------------------------- ---------------------------
以- 开头的字段是(部分)主键。
外键如下:
customer join address on
(customer.id = address.customer_id
and customer.address_code = address.address_code
and (case when customer.primary_language_code <= 2
then customer.primary_language_code
else customer.secondary_language_code
end) = address.COD_LAN)
以下是模型:
@Getter \
@Setter | //lombok
@NoArgsConstructor /
@Entity
@Table(name = "customer")
public class Customer{
@Id
@Column(name="id")
private int id;
@Column(name="primary_language_code")
private int primaryLanguageCode;
@Column(name="secondary_language_code")
private int secondaryLanguageCode;
?
private Address address;
}
@Getter \
@Setter | //lombok
@NoArgsConstructor /
@Entity
@Table(name = "address")
public class Address {
@EmbeddedId
private AddressId id;
}
@Getter \
@Setter | //lombok
@NoArgsConstructor /
@Embeddable
public class AddressId implements Serializable, Comparable<AddressId> {
@Column(name = "customer_id")
private int customerId;
@NonNull
@Column(name = "address_code")
private String addressCode;
?
private int languageCode;
}
编辑:
- 我尝试使用计算字段并从该字段映射。问题:如何映射这个计算字段?
- 我尝试使用 @Where 子句,但模型字段名称连接到 sql 查询字段
customer0_.address_primary_language_code:
@Where(clause = "(customer.primary_language_code <= 2 then customer.primary_language_code else customer.secondary_language_code end) = address.COD_LAN)")
- 我也尝试了其他几件事,但都没有成功。
【问题讨论】:
-
在这种情况下,您应该使用注释 oneToOne 映射。示例示例baeldung.com/jpa-one-to-one
-
还要使用addressCode加入列
-
我的问题不是如何使用简单的一对一映射。我的问题是列将根据条件映射列
primary_language_code或secondary_language_code。这个条件怎么写? -
我的建议是按原样加载它并在模型对象中管理条件。
-
这是我目前正在做的解决方法,因为找不到我的问题的解决方案。但是,我对此感觉不太好,因为我正在更改的代码(模型)被其他几个应用程序使用:/