英文:
"No persistent classes found for query class" error when I try map object using HQL
问题
我想直接从数据库映射自定义对象(ApplicationStatus
到 Status
)使用 HQL 构造方法。但查询结果为空,Hibernate 返回如下消息。
2020-08-14 17:22:45.224 WARN 6668 --- [nio-9090-exec-2] o.hibernate.hql.internal.QuerySplitter : HHH000183: 查询类未找到持久化类: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
以下是我的 Hibernate 配置 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.status, " +
"stat.application.name, stat.application.production.name, " +
"stat.log, stat.requestTime, stat.checked, 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 = FetchType.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
Status 对象:
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
英文:
I would like to map custom object directly from database (ApplicationStatus
to Status
) using HQL constructor method. But result of query is empty and Hibernate return message like below.
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
Here is my hibernate config xml file:
<?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>
Method with query:
@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.status, " +
"stat.application.name, stat.application.production.name, " +
"stat.log, stat.requestTime, stat.checked, 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:
@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
Status object:
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
答案1
得分: 0
检查@Table注解中的表名称,也许全大写会起作用。可能您还需要提供模式(schema)。
英文:
Check table name at @Table annotation, maybe all caps would work . Probably you need to provide schema too.
答案2
得分: 0
Status类没有使用任何@Entity注解进行声明。但是却定义了一个映射,如下所示:<mapping class="com.tt.practices6.map.Status"/>
。
因此,Hibernate将期望一个实体Status。
针对您的目的,您可以首先查询ApplicationStatus。然后在将值提取到Query<ApplicationQuery>
之后,您可以创建一个自定义对象。否则,您可以在XML中移除映射,然后尝试您的代码。
英文:
Status class is not declared with any @Entity annotation. But defined a mapping for it <mapping class="com.tt.practices6.map.Status"/>
.
So, Hibernate will expect an Entity Status.
For your purpose, you can first query the ApplicationStatus. Then after fetching the values into Query<ApplicationQuery>
, you can create a custom object. Or else, remove the mapping in xml & try your code.
专注分享java语言的经验与见解,让所有开发者获益!
评论