java—如何将hibernate查询的结果Map到dto对象?

whlutmcx  于 2021-07-12  发布在  Java
关注(0)|答案(3)|浏览(550)

我有以下3个 Hibernate 我的系统中的实体 Java 项目:
公司状态

@Entity(name = "company_status")
@Table(name = "company_status")
public class CompanyStatus implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    @JsonProperty
    @Column(name = "company_status_id")
    private Integer companyStatusId;

    @JsonProperty
    @Column(name = "company_status_label")
    private String companyStatusLabel;

}

员工状态

@Entity(name = "employee_status")
@Table(name = "employee_status")
public class EmployeeStatus implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @JsonProperty
    @Column(name = "employee_status_id")
    private Integer employeeStatusId;

    @JsonProperty
    @Column(name = "employee_status_name")
    private String employeeStatusName;

    // many other fields
}

公司状态员工状态(链接两个实体的实体-一对一关系)

@Entity(name = "company_status_employee_status")
@Table(name = "company_status_employee_status")
public class CompanyStatusEmployeeStatus implements Serializable {

    // int(20)
    @Id
    @JsonProperty
    @Column(name = "company_status_id")
    private Integer companyStatusId;

    // int(20)
    @JsonProperty
    @Column(name = "employee_status_id")
    private Integer employeeStatusId;
}

我只想将json响应中的必要字段返回到前端,因此为此我创建了一个较小的 CompanyStatusDTO 也有 EmployeeStatusDTO 嵌套列表
公司状态

public class CompanyStatusDTO {

    @JsonProperty
    private Integer companyStatusId;

    @JsonProperty
    private String companyStatusLabel;

    @JsonProperty
    private List <EmployeeStatusDTO> employeeStatusDTOs;

}

员工状态到

public class EmployeeStatusDTO {

    @JsonProperty
    private Integer employeeStatusId;

    @JsonProperty
    private String employeeStatusName;

}

但是,我对使用hibernate还比较陌生—有没有一种方法可以让我创建一个查询,直接从我的数据库Map结果 MySQL 数据库到我的 CompanyStatusDTO 反对?
如果是,我该怎么做?

yhxst69z

yhxst69z1#

您可以使用nativequery(数据类型必须匹配)将查询结果直接Map到所需的dto

String q = "select ... from table"; // your sql query
Query query = getEntityManager().createNativeQuery(q, "EmployeeStatusDTO");
EmployeeStatusDTO data = (EmployeeStatusDTO) query.getSingleResult();
return data;
zxlwwiss

zxlwwiss2#

这是blaze持久性实体视图的完美用例。
我创建了这个库,以便在jpa模型和自定义接口或抽象类定义的模型之间进行简单的Map,比如spring数据在steroids上的投影。其思想是以您喜欢的方式定义目标结构(域模型),并通过jpql表达式将属性(getter)Map到实体模型。
如果你能适应 CompanyStatus 以及 CompanyStatusEmployeeStatus 添加一点实体并添加以下内容:

public class CompanyStatus implements Serializable {
  //...
  @OneToMany(mappedBy = "companyStatus")
  private Set<CompanyStatusEmployeeStatus> employeeStatuses;
}

public class CompanyStatusEmployeeStatus implements Serializable {
    //...
    @JsonProperty
    @ManyToOne(fetch = LAZY)
    @JoinColumn(name = "company_status_id", insertable = false, updatable = false)
    private CompanyStatus companyStatus;

    @JsonProperty
    @ManyToOne(fetch = LAZY)
    @JoinColumn(name = "employee_status_id", insertable = false, updatable = false)
    private EmployeeStatus employeeStatus;
}

您的模型可能如下所示:

@EntityView(CompanyStatus.class)
public interface CompanyStatusDTO {
    @IdMapping
    Integer getCompanyStatusId();
    String getCompanyStatusLabel();
    @Mapping("employeeStatuses.employeeStatus")
    List<EmployeeStatusDTO> getEmployeeStatusDTOs();
}
@EntityView(EmployeeStatus.class)
public interface EmployeeStatusDTO {
    @IdMapping
    Integer getEmployeeStatusId();
    String getEmployeeStatusName();
}

查询是将实体视图应用于查询的问题,最简单的就是按id进行查询。 CompanyStatusDTO c = entityViewManager.find(entityManager, CompanyStatusDTO.class, id); spring数据集成允许您像spring数据投影一样使用它:https://persistence.blazebit.com/documentation/entity-view/manual/en_us/index.html#spring-数据特征

kninwzqo

kninwzqo3#

你可以试试这个:

public class Dao{

    private SessionFactory sessionFactory;

    public Dao(SessionFactory sessionFactory) {
      this.sessionFactory = sessionFactory;
    }

    public <T> T save(final T o){
      return (T) sessionFactory.getCurrentSession().save(o);
    }

    public void delete(final Object object){
      sessionFactory.getCurrentSession().delete(object);
    }

    public <T> T get(final Class<T> type, final Long id){
      return (T) sessionFactory.getCurrentSession().get(type, id);
    }

    public <T> List<T> getAll(final Class<T> type) {
      final Session session = sessionFactory.getCurrentSession();
      final Criteria crit = session.createCriteria(type);
  return crit.list();
    }
// and so on, you should get the idea

然后您可以在服务层中这样访问:

private Dao dao;

    @Transactional(readOnly = true)
    public List<MyEntity> getAll() {
      return dao.getAll(MyEntity.class);
    }

相关问题