有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java将值映射到实体中缺少的DTO

我想在使用SQL JOIN执行SQL查询后实现DTO映射:

查询:

public List<Businesses> findCompaniesBusinessesById(Integer id) {
    String hql = "SELECT bus FROM " + Businesses.class.getName() + " bus " 
                + " INNER JOIN " + Companies.class.getName() + " comp "
                + " ON comp.id = bus.company_id " 
                + " WHERE bus.business_owner_id = :id "
                + " AND bus.business_owner_type = 'Merchant' "
                + " ORDER BY bus.id ASC";
    TypedQuery<Businesses> query = entityManager.createQuery(hql, Businesses.class).setParameter("id", id);
    List<Businesses> businesses = query.getResultList();
    return businesses;
}

实体公司:

@Entity
@Table(name = "companies")
public class Companies implements Serializable {

    @Id
    @Column(name = "id", unique = true, updatable = false, nullable = false)
    private int id;

    @Column(length = 255)
    private String name;

    @Column
    @Convert(converter = LocalDateTimeConverter.class)
    private LocalDateTime created_at;

    @Column
    @Convert(converter = LocalDateTimeConverter.class)
    private LocalDateTime updated_at;
    ...
}

实体业务:

@Entity
@Table(name = "businesses")
public class Businesses {

    @Id
    @Column(name = "id", unique = true, updatable = false, nullable = false)
    private int id;

    @Column(length = 4)
    private Integer business_owner_id;

    @Column(length = 255)
    private String business_owner_type;

    @Column(length = 4)
    private Integer company_id;

    @Column
    @Convert(converter = LocalDateTimeConverter.class)
    private LocalDateTime created_at;

    @Column
    @Convert(converter = LocalDateTimeConverter.class)
    private LocalDateTime updated_at;
    .......
}

!注意在业务实体中,我们没有设计属性name

DTO:

public class BusinessesDTO {

    private Integer id;

    private String name;

    ....... 
}

!注意在业务中,我们希望通过设计name,并希望对其进行映射

DTO映射:

@Mapper(config = BaseMapperConfig.class)
public interface BusinessesMapper {

    BusinessesDTO toDTO(Businesses company);
    .....
}

手动执行查询时的查询结果:

SELECT * FROM  businesses bus   
        INNER JOIN  companies comp
          ON comp.id = bus.company_id 
          WHERE bus.business_owner_id = 1
          AND bus.business_owner_type = 'Merchant' 
          ORDER BY bus.id ASC

enter image description here

正如您所看到的,有一个列名

我尝试使用以下映射获取代码:

@Autowired
private BusinessesMapper businesses_mapper;

List<BusinessesDTO> list = null;
try {
    list = StreamSupport.stream(merchantService.findCompaniesBusinessesById(id).spliterator(), false)
        .map(businesses_mapper::toDTO)
        .collect(Collectors.toList());
} catch (Exception e) {
    e.printStackTrace();
}

String joinedList = list.stream()
    .map(BusinessesDTO::getName)
    .collect(Collectors.joining(", "));

但结果是我得到了NULL。由于某些原因,名称映射不正确,我找不到原因

是否可以不将name属性映射到Businesses实体中,并使用DTO将存在的name字段映射到SQL查询中

从SQL查询图片中,我得到了正确的名称,正如您在上面看到的那样。你能告诉我哪里错了吗


共 (0) 个答案