Java 映射正在返回空值

Java 映射正在返回空值,java,sql,jpa,spring-data-jpa,Java,Sql,Jpa,Spring Data Jpa,我想在使用JOIN执行SQL查询后实现DTO映射: 查询: public List<Businesses> findCompaniesBusinessesById(Integer id) { String hql = "SELECT bus FROM " + Businesses.class.getName() + " bus " + " INNER JOIN " + Companies.class.getName() + " com

我想在使用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;
    }
!注意在业务实体中,我们没有设计属性
名称

DTO:

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

DTO映射:

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

    BusinessesDTO toDTO(Businesses company);
    .....
}
查询结果:

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

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

@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(", "));
@Autowired
私营企业mapper Business_mapper;
List=null;
试一试{
list=StreamSupport.stream(merchantService.findcompaniesbusinessbyid.spliterator(),false)
.map(业务映射器::toDTO)
.collect(Collectors.toList());
}捕获(例外e){
e、 printStackTrace();
}
String joinedList=list.stream()
.map(BusinessSDTO::getName)
.collect(收集器。连接(“,”);

但对于结果,我得到NULL或NULL,NULL。由于某些原因,名称映射不正确,我找不到原因。你能告诉我我哪里错了吗?

你设置的方式根本不起作用。
EntityManager
返回域对象。 它们没有任何信息,因此select语句中没有其他列。 因此,您的映射器没有任何可从中获取名称

您需要实际从select返回名称。
一个有吸引力的选择是使用元组。

您尝试过使用元组吗?当您不想为每个查询添加大量DTO时,这非常方便

TypedQuery<Tuple> query = entityManager.createQuery(hql, Tuple.class);
List<Tuple> tuples = query.getResultList();

List<BusinessesDTO> list = new ArrayList<>();
tuples.forEach((record) ->
    {
        String name = (String) record.get("name"); 
        BusinessesDTO dto = new BusinessesDTO(name);
        list.add(dto); 
    });
TypedQuery query=entityManager.createQuery(hql,Tuple.class);
List tuples=query.getResultList();
列表=新的ArrayList();
tuples.forEach((记录)->
{
String name=(String)record.get(“name”);
BusinessesDTO dto=新BusinessesDTO(名称);
列表。添加(dto);
});

没有足够的信息来回答此问题。我不明白问题出在哪里:merchantService.FindCompanysBusinesssById(id)返回的值是否正确?如果没有,您应该在问题中添加hibernate的映射配置。如果它有效,你应该在你的问题中添加商业映射器::toDTO实现。@Sodala请查看更新的帖子。我不明白。实体中没有名称,您希望映射dto中不存在的字段。只需将其添加到您的实体中即可。@Sodala是的。是否可以在不将其添加到实体中的情况下实现此功能?请更正,我的实体中没有名称,我希望映射dto中确实存在的字段。请告诉我如何从select返回名称?请查看链接。如果你对此有问题,就你面临的具体问题问一个新问题。不,它会被命名吗?试试看。该查询返回元组列表中查询返回的任何内容。如果愿意,也可以获得索引值
@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(", "));
TypedQuery<Tuple> query = entityManager.createQuery(hql, Tuple.class);
List<Tuple> tuples = query.getResultList();

List<BusinessesDTO> list = new ArrayList<>();
tuples.forEach((record) ->
    {
        String name = (String) record.get("name"); 
        BusinessesDTO dto = new BusinessesDTO(name);
        list.add(dto); 
    });