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