“No persistent classes found for query class” error when I try map object using HQL

huangapple 未分类评论79阅读模式
英文:

"No persistent classes found for query class" error when I try map object using HQL

问题

我想直接从数据库映射自定义对象(ApplicationStatusStatus)使用 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:

&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
&lt;!DOCTYPE hibernate-configuration PUBLIC
        &quot;-//Hibernate/Hibernate Configuration DTD 3.0//EN&quot;
        &quot;https://hibernate.org/dtd/hibernate-configuration-3.0.dtd&quot;&gt;
&lt;hibernate-configuration&gt;
    &lt;session-factory&gt;
        &lt;property name=&quot;hibernate.connection.driver_class&quot;&gt;org.postgresql.Driver&lt;/property&gt;
        &lt;property name=&quot;hibernate.connection.password&quot;&gt;passwd&lt;/property&gt;
        &lt;property name=&quot;hibernate.connection.url&quot;&gt;jdbc:postgresql://localhost:5432/postgres&lt;/property&gt;
        &lt;property name=&quot;hibernate.connection.username&quot;&gt;user&lt;/property&gt;
        &lt;property name=&quot;hibernate.dialect&quot;&gt;org.hibernate.dialect.PostgreSQL9Dialect&lt;/property&gt;

        &lt;property name=&quot;hibernate.current_session_context_class&quot;&gt;thread&lt;/property&gt;
        &lt;property name=&quot;hibernate.show_sql&quot;&gt;true&lt;/property&gt;

        &lt;mapping class=&quot;com.tt.practices6.model.ApplicationStatus&quot;/&gt;
        &lt;mapping class=&quot;com.tt.practices6.model.Application&quot;/&gt;
        &lt;mapping class=&quot;com.tt.practices6.model.Production&quot;/&gt;
        &lt;mapping class=&quot;com.tt.practices6.map.Status&quot;/&gt;
    &lt;/session-factory&gt;
&lt;/hibernate-configuration&gt;

Method with query:

    @Transactional
    @GetMapping(&quot;/applicationsStatus/map/list&quot;)
    public ResponseEntity&lt;List&lt;Status&gt;&gt; getAllMappedApplicationsStatus() {

        SessionFactory sessionFactory = HibernateUtil.getSessionFactory();
        Session session = sessionFactory.getCurrentSession();
        Transaction tx = session.beginTransaction();

        Query&lt;Status&gt; statusesQuery = session.createQuery(
                &quot;select new com.tt.practices6.map.Status(stat.id, stat.status, &quot; +
                        &quot;stat.application.name, stat.application.production.name, &quot; +
                        &quot;stat.log, stat.requestTime, stat.checked, stat.idUserChecked) &quot; +
                        &quot;from com.tt.practices6.model.ApplicationStatus stat&quot;
        );

        System.out.println(statusesQuery.getResultList());
        List&lt;Status&gt; statuses = new ArrayList&lt;&gt;(statusesQuery.list());

        tx.rollback();
        sessionFactory.close();

        return ResponseEntity.ok().body(statuses);
    }

ApplicationStatus entity:

@Entity
@Table(name = &quot;applications_status&quot;)
public class ApplicationStatus {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    private boolean status;

    @ManyToOne(fetch = LAZY)
    @JoinColumn(name=&quot;guid_application&quot;, referencedColumnName = &quot;guid&quot;)
    @JsonBackReference
    private Application application;

    private String log;

    @DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME)
    private LocalDateTime requestTime;

    private boolean checked;

    @Column(name = &quot;id_user_checked&quot;)
    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注解进行声明。但是却定义了一个映射,如下所示:&lt;mapping class=&quot;com.tt.practices6.map.Status&quot;/&gt;
因此,Hibernate将期望一个实体Status

针对您的目的,您可以首先查询ApplicationStatus。然后在将值提取到Query&lt;ApplicationQuery&gt;之后,您可以创建一个自定义对象。否则,您可以在XML中移除映射,然后尝试您的代码。

英文:

Status class is not declared with any @Entity annotation. But defined a mapping for it &lt;mapping class=&quot;com.tt.practices6.map.Status&quot;/&gt;.
So, Hibernate will expect an Entity Status.

For your purpose, you can first query the ApplicationStatus. Then after fetching the values into Query&lt;ApplicationQuery&gt;, you can create a custom object. Or else, remove the mapping in xml & try your code.

huangapple
  • 本文由 发表于 2020年8月14日 23:45:16
  • 转载请务必保留本文链接:https://java.coder-hub.com/63415987.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定