【问题标题】:trim mapping columns in JPA修剪 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)

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

【问题讨论】:

    标签: oracle spring-boot jpa mapping


    【解决方案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】:

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

    【讨论】:

    • 您找到其他解决方案了吗?我有同样的问题,我不想创建视图。提前致谢
    猜你喜欢
    • 2021-10-12
    • 1970-01-01
    • 2012-01-04
    • 2011-07-13
    • 2019-10-28
    • 1970-01-01
    • 1970-01-01
    • 2023-03-15
    • 1970-01-01
    相关资源
    最近更新 更多