修剪 JPA 中的映射列

Posted

技术标签:

【中文标题】修剪 JPA 中的映射列【英文标题】:trim mapping columns in JPA 【发布时间】:2021-03-20 19:24:32 【问题描述】:

我有两张表,即员工和部门。两个表都与列部门代码映射。我在这之间使用@OneToOne 关系。但是由于部门代码中的空格,我的查询失败了。

@Table(name = "EMP_MASTER")
public class Employee
    @Id
    @Column(name = "idcode")
    private String idcode;
    
    @OneToOne
    @JoinColumn(name="DEPT_CD", referencedColumnName = "DEPT_CD")
    private Department dept;
   
    //some more columns



@Table(name = "DEPT_MASTER")
public class Department
    @Id
    @Column(name = "DEPT_CD")
    private String deptCode;
    
    //some more columns

在存储库中,我使用的是简单的查询方法。

Optional<Employee> findByIdcodeIs(String idcode);

查询也很完美;但是这个连接不能正常工作。

left outer join
     dept_master deptmaster1_
          on employee0_.dept_cd=deptmaster1_.dept_cd

而不是这个,如果我使用 TRIM() 在数据库级别更改以下查询,那么它会给我正确的结果。

left outer join
     dept_master deptmaster1_
          on TRIM(employee0_.dept_cd)=TRIM(deptmaster1_.dept_cd)

那么有没有办法在映射级别上应用修剪?

【问题讨论】:

【参考方案1】:

要在映射级别更改值,您可以尝试 JPA aAttribute 转换器。然后应用于映射字段。

示例: 映射:

@Id
@Column(name = "DEPT_CD")
@Convert(converter = TrimConverter.class)
private String deptCode;

转换器:

public class TrimConverter implements AttributeConverter<String, String> 

    @Override
    public String convertToDatabaseColumn(String value) 
        return value.trim();
    

    @Override
    public String convertToEntityAttribute(String value) 
        if (value == null) 
            return null;
        

        return value.trim();
    

【讨论】:

@Convert 不适用于 @JoinColumn@Id 注释【参考方案2】:

我通过在这些列上应用修剪来创建表格视图。这解决了我的问题。 我知道这不是正确的解决方案。期待更多答案。

【讨论】:

您找到其他解决方案了吗?我有同样的问题,我不想创建视图。提前致谢

以上是关于修剪 JPA 中的映射列的主要内容,如果未能解决你的问题,请参考以下文章

在 jpa 本机查询中选择特定列并映射到 pojo

如何使用 JPA/Hibernate 注释将 MySQL char(n) 列映射到实例变量?

将 MySQL json 列映射到 JPA 会引发错误

如何将 TIMESTAMP 列映射到 ZonedDateTime JPA 实体属性?

如何使用 JPA 和 Hibernate 将 MySQL JSON 列映射到 Java 实体属性

使用 JPA 和 Hibernate 将 Java 布尔值映射到 Oracle Number 列