admin 管理员组

文章数量: 1184232

Spring data JPA使用@formula注解使用、查询不到内容

@Formula注解就是使用查询语句动态生成类的一个属性,是一个虚拟的列,其并不存储在数据库中。
以下为一个与数据表映射的实体:

@Data
@Entity
@Table ( name ="t_organization" )
@GenericGenerator(name = "jpa_uuid", strategy = "uuid")
public class IndRiskClue implements Serializable {private static final long serialVersionUID =  1786368157796487306L;@Id@GeneratedValue(generator = "jpa_uuid")@Column(name = "id" )private String id;@Column(name = "org_name" )private String orgName;//所属区划code@Column(name = "region_code" )private String regionCode;//所属区划名称@Formula(value = "(select c.area_name from t_area c where c.area_code=region_code)")private String  areaName;
}

注意:@Formula注解必须在属性上,在方法上将失效

当使用JPA的findById()方法查询该实体时,会展示相应所属区划的名称,即:areaName字段

  • 记使用@Formula注解时出现的问题:
    问题一
    上面的代码使用了lombok的@Data注解,其在实体中自动生成了get和set方法。有一次使用@Formula注解时,实体的get和set方法不是使用注解自动生成的,当查询实体时出现了@Formula注解标注的字段不显示的问题,最后排查到是因为被注解字段没有get方法所致(set方法并不会影响该字段的获取),加上该字段的get方法后查询的结果显示完全。
    问题二
    问题出现场景:首先更新具有@Formula注解的实体,更新方法返回的不是void,而是当前更新的实体。
    此时明明更新是成功的,但是返回的实体中@Formula注解的字段为空,如下代码:
    使用@Formula注解的实体:
@Entity
@Data
@Table(name = "t_org_rel", schema = "XXX")
public class OrgRel implements java.io.Serializable{@Id@Column(name = "id")private Long id;@Basic@Column(name = "org_id")private Integer orgId;@Basic@Column(name = "org_location")private String orgLocation;//.......@Formula("(select t_name from org_info t where t.id = org_id)")private String orgName;
}

更新接口需要传入的实体:

@Data
public class OrgRelDto {private OrgInfo orgInfo;private OrgRel orgRel;
}

具体更新方法:
该方法更新OrgRel,并且返回OrgRel

public OrgRel update(OrgRelDto entity) {repository.save(entity.getOrgRel());return findByOrgId(entity.getOrgRel().getOrgId());
}
//此方法在controller处也有调用
public OrgRel findByOrgId(Integer orgId) {OrgRel tAuthOrgRel = repository.findByOrgId(orgId);return tAuthOrgRel;
}

问题出现的原因:
更新时传入的参数OrgRelDto中的orgRel也有orgRel字段,且该字段传入了空值,所以更新后返回的OrgRel中orgName也是空值
解决问题
只需要在更新时不传入orgRel中的orgName字段,注意不传入是指更新时OrgRel压根就没有orgName字段

本文标签: Spring data JPA使用formula注解使用查询不到内容