问题描述
我想使用HQL构造函数方法将自定义对象直接从数据库(ApplicationStatus
映射到Status
)。但是查询结果为空,并且Hibernate返回如下消息。
2020-08-14 17:22:45.224 WARN 6668 --- [nio-9090-exec-2] o.hibernate.hql.internal.QuerySplitter : HHH000183: no persistent classes found for query class: select new com.tt.practices6.map.Status(stat.id,stat.status,stat.application.name,stat.application.production.name,stat.log,stat.requestTime,stat.checked,stat.idUserChecked) from com.tt.practices6.model.ApplicationStatus stat
这是我的休眠配置xml文件:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"https://hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<property name="hibernate.connection.driver_class">org.postgresql.Driver</property>
<property name="hibernate.connection.password">passwd</property>
<property name="hibernate.connection.url">jdbc:postgresql://localhost:5432/postgres</property>
<property name="hibernate.connection.username">user</property>
<property name="hibernate.dialect">org.hibernate.dialect.Postgresql9Dialect</property>
<property name="hibernate.current_session_context_class">thread</property>
<property name="hibernate.show_sql">true</property>
<mapping class="com.tt.practices6.model.ApplicationStatus"/>
<mapping class="com.tt.practices6.model.Application"/>
<mapping class="com.tt.practices6.model.Production"/>
<mapping class="com.tt.practices6.map.Status"/>
</session-factory>
</hibernate-configuration>
@Transactional
@GetMapping("/applicationsstatus/map/list")
public ResponseEntity<List<Status>> getAllMappedApplicationsstatus() {
SessionFactory sessionFactory = HibernateUtil.getSessionFactory();
Session session = sessionFactory.getCurrentSession();
Transaction tx = session.beginTransaction();
Query<Status> statusesQuery = session.createquery(
"select new com.tt.practices6.map.Status(stat.id," +
"stat.application.name," +
"stat.log,stat.idUserChecked) " +
"from com.tt.practices6.model.ApplicationStatus stat"
);
System.out.println(statusesQuery.getResultList());
List<Status> statuses = new ArrayList<>(statusesQuery.list());
tx.rollback();
sessionFactory.close();
return ResponseEntity.ok().body(statuses);
}
ApplicationStatus实体:
@Entity
@Table(name = "applications_status")
public class ApplicationStatus {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
private boolean status;
@ManyToOne(fetch = LAZY)
@JoinColumn(name="guid_application",referencedColumnName = "guid")
@JsonBackReference
private Application application;
private String log;
@DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME)
private LocalDateTime requestTime;
private boolean checked;
@Column(name = "id_user_checked")
private Long idUserChecked;
public ApplicationStatus() {
}
// setters and getters
状态对象:
public class Status {
private Long id;
private boolean status;
private String applicationName;
private String productionName;
private String log;
private LocalDateTime requestTime;
private boolean checked;
private Long idUserChecked;
public Status(Long id,boolean status,String applicationName,String productionName,String log,LocalDateTime requestTime,boolean checked,Long idUserChecked) {
this.id = id;
this.status = status;
this.applicationName = applicationName;
this.productionName = productionName;
this.log = log;
this.requestTime = requestTime;
this.checked = checked;
this.idUserChecked = idUserChecked;
}
// setters and getters
解决方法
在@Table注释处检查表名称,也许所有大写字母都可以使用。也许您也需要提供架构。
, 状态类未使用任何@Entity注释声明。但是为它<mapping class="com.tt.practices6.map.Status"/>
定义了一个映射。
因此,Hibernate将期望一个实体状态。
出于您的目的,您可以首先查询ApplicationStatus。然后,将值提取到Query<ApplicationQuery>
中之后,您可以创建一个自定义对象。否则,请删除xml中的映射并尝试您的代码。