Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将Hibernate本机查询返回的值映射到模型_Java_Sql_Hibernate - Fatal编程技术网

Java 将Hibernate本机查询返回的值映射到模型

Java 将Hibernate本机查询返回的值映射到模型,java,sql,hibernate,Java,Sql,Hibernate,我对冬眠很陌生。我将它与我的Spring Boot项目一起使用。由于涉及复杂的联接,我想编写本机SQL查询。 在执行查询时,返回的值以列表的形式出现,没有简单的方法将它们映射到HashMap 现在我正在使用下面的方法,这种方法很有效,但严重依赖于从查询列表返回的值的顺序 有没有简单有效的方法来绘制这个结果 刀 您可以为此使用SQL Transformers: 使用本机sql返回非实体bean或映射,通常比使用基本对象[]更有用。与结果变压器,这是可能的 示例: List resultWithAl

我对冬眠很陌生。我将它与我的Spring Boot项目一起使用。由于涉及复杂的联接,我想编写本机SQL查询。 在执行查询时,返回的值以列表的形式出现,没有简单的方法将它们映射到HashMap

现在我正在使用下面的方法,这种方法很有效,但严重依赖于从查询列表返回的值的顺序

有没有简单有效的方法来绘制这个结果


您可以为此使用SQL Transformers:

使用本机sql返回非实体bean或映射,通常比使用基本对象[]更有用。与结果变压器,这是可能的

示例:

List resultWithAliasedBean = s.createSQLQuery(
  "SELECT st.name as studentName, co.description as courseDescription " +
  "FROM Enrolment e " +
  "INNER JOIN Student st on e.studentId=st.studentId " +
  "INNER JOIN Course co on e.courseCode=co.courseCode")
  .addScalar("studentName")
  .addScalar("courseDescription")
  .setResultTransformer( Transformers.aliasToBean(StudentDTO.class))
  .list();

StudentDTO dto =(StudentDTO) resultWithAliasedBean.get(0);
参考资料:
有一种简单而有效的方法来映射此结果

与其创建一个方法,然后将所需的返回值映射到一个bean类,不如创建一个实体类,其中包含与查询中返回的字段映射的所有字段

使用@NamedNativeQuery提供查询,使用@SqlResultSetMapping映射执行查询后要返回的字段

比如说

@NamedNativeQuery(
            name = "getTenders",
            query = "SELECT t.id, t.created_at, CONCAT(u.first_name, ' ' , u.last_name) as created_by, t.modified_at, CONCAT(u2.first_name, ' ' , u2.last_name) as modified_by, t.tenders_abbreviation, t.tenders_full_name FROM abc.tenders v\n" + 
                    "LEFT JOIN abc.users u on u.id = v.created_by LEFT JOIN rbac.users u2 on u2.id = v.modified_by",
            resultSetMapping = "tendersMappings"
            )

@SqlResultSetMapping(name = "tendersMappings", entities = {
        @EntityResult(entityClass = TendersEntity.class, fields = {
                @FieldResult(name = "id", column = "id"),
                @FieldResult(name = "created_at", column = "created_at"),
                @FieldResult(name = "modified_at", column = "modified_at"),
                @FieldResult(name = "tenders_abbreviation", column = "tenders_abbreviation"),
                @FieldResult(name = "tenders_full_name", column = "tenders_full_name"),
                @FieldResult(name = "created_by", column = "created_by"),
                @FieldResult(name = "modified_by", column = "modified_by")
                }) 
        })
@Entity
@Table(name = "tenders", schema = "abc")
public class TendersEntity {


    private static final long serialVersionUID = 1L;

    @Id
    private Integer id;

    @Column(name = "created_at")
    private String created_at;

    @Column(name = "created_by")
    private String created_by;

    @Column(name = "modified_at")
    private String modified_at;

    @Column(name = "modified_by")
    private String modified_by;

    @Column(name = "tenders_abbreviation")
    private String tenders_abbreviation;

    @Column(name = "tenders_full_name")
    private String tenders_full_name;


    public TendersEntity() {}

    // setters and getters
}
//刀类

@Repository
@Transactional
public class TendersDaoImpl implements TendersDao {

    @Autowired
    EntityManager manager;

    @Override
    public List<TendersEntity> getVendors() {
        List<TendersEntity> dataList = new ArrayList<>();
        Query query = manager.createNamedQuery("getTenders");
        try {
            dataList.addAll(query.getResultList());
        } catch (Exception ex) {
            …….// exception code
        }
        return dataList;
    }
}
@存储库
@交易的
公共类TendersDaoImpl实现TendersDao{
@自动连线
实体经理;
@凌驾
公共列表getVendors(){
List dataList=new ArrayList();
Query=manager.createNamedQuery(“getTenders”);
试一试{
addAll(query.getResultList());
}捕获(例外情况除外){
……异常代码
}
返回数据列表;
}
}

StudentDTO的内容是什么?在您的情况下,它将是UserModel。您有@Table(name=“tenders”,schema=“abc”),即有一个表。但是sql是多个表的连接。映射是如何发生的?这里是基表,映射是基于查询返回的数据完成的
List resultWithAliasedBean = s.createSQLQuery(
  "SELECT st.name as studentName, co.description as courseDescription " +
  "FROM Enrolment e " +
  "INNER JOIN Student st on e.studentId=st.studentId " +
  "INNER JOIN Course co on e.courseCode=co.courseCode")
  .addScalar("studentName")
  .addScalar("courseDescription")
  .setResultTransformer( Transformers.aliasToBean(StudentDTO.class))
  .list();

StudentDTO dto =(StudentDTO) resultWithAliasedBean.get(0);
@NamedNativeQuery(
            name = "getTenders",
            query = "SELECT t.id, t.created_at, CONCAT(u.first_name, ' ' , u.last_name) as created_by, t.modified_at, CONCAT(u2.first_name, ' ' , u2.last_name) as modified_by, t.tenders_abbreviation, t.tenders_full_name FROM abc.tenders v\n" + 
                    "LEFT JOIN abc.users u on u.id = v.created_by LEFT JOIN rbac.users u2 on u2.id = v.modified_by",
            resultSetMapping = "tendersMappings"
            )

@SqlResultSetMapping(name = "tendersMappings", entities = {
        @EntityResult(entityClass = TendersEntity.class, fields = {
                @FieldResult(name = "id", column = "id"),
                @FieldResult(name = "created_at", column = "created_at"),
                @FieldResult(name = "modified_at", column = "modified_at"),
                @FieldResult(name = "tenders_abbreviation", column = "tenders_abbreviation"),
                @FieldResult(name = "tenders_full_name", column = "tenders_full_name"),
                @FieldResult(name = "created_by", column = "created_by"),
                @FieldResult(name = "modified_by", column = "modified_by")
                }) 
        })
@Entity
@Table(name = "tenders", schema = "abc")
public class TendersEntity {


    private static final long serialVersionUID = 1L;

    @Id
    private Integer id;

    @Column(name = "created_at")
    private String created_at;

    @Column(name = "created_by")
    private String created_by;

    @Column(name = "modified_at")
    private String modified_at;

    @Column(name = "modified_by")
    private String modified_by;

    @Column(name = "tenders_abbreviation")
    private String tenders_abbreviation;

    @Column(name = "tenders_full_name")
    private String tenders_full_name;


    public TendersEntity() {}

    // setters and getters
}
@Repository
@Transactional
public class TendersDaoImpl implements TendersDao {

    @Autowired
    EntityManager manager;

    @Override
    public List<TendersEntity> getVendors() {
        List<TendersEntity> dataList = new ArrayList<>();
        Query query = manager.createNamedQuery("getTenders");
        try {
            dataList.addAll(query.getResultList());
        } catch (Exception ex) {
            …….// exception code
        }
        return dataList;
    }
}