Подтвердить что ты не робот

Org.hibernate.hql.ast.QuerySyntaxException с Hibernate

Я новичок в использовании Hibernate с Java. Я получаю следующее исключение. То, что я нашел в Интернете относительно этой ошибки, похоже, не помогло. Есть идеи? Исключение:

java.lang.IllegalArgumentException: org.hibernate.hql.ast.QuerySyntaxException: 

ApplPerfStats is not mapped [select count(c) from ApplPerfStats c]
    at org.hibernate.ejb.AbstractEntityManagerImpl.throwPersistenceException(AbstractEntityManagerImpl.java:601)
    at org.hibernate.ejb.AbstractEntityManagerImpl.createQuery(AbstractEntityManagerImpl.java:96)
    at com.icesoft.icefaces.samples.datatable.jpa.CustomerDAO.findTotalNumberCustomers(CustomerDAO.java:89)
    at com.icesoft.icefaces.samples.datatable.ui.SessionBean.getDataPage(SessionBean.java:189)
    at com.icesoft.icefaces.samples.datatable.ui.SessionBean.access$0(SessionBean.java:185)
    at com.icesoft.icefaces.samples.datatable.ui.SessionBean$LocalDataModel.fetchPage(SessionBean.java:245)
    at com.icesoft.icefaces.samples.datatable.ui.PagedListDataModel.getPage(PagedListDataModel.java:121)
    at com.icesoft.icefaces.samples.datatable.ui.PagedListDataModel.getRowCount(PagedListDataModel.java:100)
    at com.icesoft.faces.component.datapaginator.DataPaginator.isModelResultSet(DataPaginator.java:1091)
    at com.icesoft.faces.component.datapaginator.DataPaginatorRenderer.encodeBegin(DataPaginatorRenderer.java:201)

Место, где это называется:

@SuppressWarnings("unchecked")
public Long findTotalNumberCustomers() {
    EntityManagerHelper.log("finding number of Customer instances", Level.INFO, null);
    try {
        String queryString = "select count(c) from ApplPerfStats c";
        return (Long) getEntityManager().createQuery(queryString).getSingleResult();
    } catch (RuntimeException re) {
        EntityManagerHelper.log("find number of Appl_perf_stats failed",
                Level.SEVERE, re);
        throw re;
    }
}

Класс, который сопоставляется с таблицей базы данных:

package com.icesoft.icefaces.samples.datatable.jpa;

import java.sql.Timestamp;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity
@Table(name = "Appl_perf_stats", uniqueConstraints = {})
public class ApplPerfStats implements java.io.Serializable {
.....

Спасибо,

Там

4b9b3361

Ответ 1

Попробуйте добавить элемент class в persistence-unit в свой persistence.xml файл.

<?xml version="1.0" encoding="UTF-8"?>
<persistence ...>

    <persistence-unit name="unit">
        <class>com.icesoft.icefaces.samples.datatable.jpa.ApplPerfStats</class>
        ...
     </persistence-unit>
<persistence>

Я не делал намного больше, чем с JPA/EntityManager, поэтому я не знаю, есть ли способ добавить весь пакет. AFAIK, при использовании hibernate.cfg.xml каждый постоянный класс должен быть указан напрямую.

Ответ 2

Это случилось со мной, пока я не начал использовать полное имя класса, например:

String queryString = "select count(c) from com.my.classes.package.ApplPerfStats c";

Но мне не нравится этот подход, потому что он рефакторинг-безоговорочно. Более приемлемым может быть:

String queryString = "select count(c) from " + ApplPerfStats.class.getName() +  c";

Решение javashlook, по-видимому, является ярлыком для этого, но добавляет больше конфигурации XML, чего я стараюсь избежать. Если только был способ, основанный на аннотации, чтобы указать, что...

Ответ 3

У меня была такая же проблема, и я решил, добавив записи aspectj в мой pom.xml, как показано ниже. Я предполагаю, что это имеет смысл, если вы используете аннотации. В противном случае вам нужно указать сопоставления в файле XML. У меня была эта проблема из проекта, который использовал банку с аннотациями JPA.

        <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>aspectj-maven-plugin</artifactId>
            <version>1.2</version> <!-- NB: do use 1.3 or 1.3.x due to MASPECTJ-90 - wait for 1.4 -->
            <dependencies>
                <!-- NB: You must use Maven 2.0.9 or above or these are ignored (see MNG-2972) -->
                <dependency>
                    <groupId>org.aspectj</groupId>
                    <artifactId>aspectjrt</artifactId>
                    <version>${aspectj.version}</version>
                </dependency>
                <dependency>
                    <groupId>org.aspectj</groupId>
                    <artifactId>aspectjtools</artifactId>
                    <version>${aspectj.version}</version>
                </dependency>
            </dependencies>
            <executions>
                <execution>
    <configuration>
        <weaveDependencies>
        <weaveDependency>                                     <groupId>your.project</groupId>                        <artifactId>your.artifact</artifactId>                     </weaveDependency>                    
        </weaveDependencies>
        </configuration>
                    <goals>
                        <goal>compile</goal>
                        <goal>test-compile</goal>
                    </goals>
                </execution>
            </executions>
            <configuration>
                <outxml>true</outxml>
                <aspectLibraries>
                    <aspectLibrary>
                        <groupId>org.springframework</groupId>
                        <artifactId>spring-aspects</artifactId>
                    </aspectLibrary>
                </aspectLibraries>
                <source>1.6</source>
                <target>1.6</target>
            </configuration>
        </plugin>

Ответ 4

Вы должны указать столбец для подсчета на

select count(c.someColumn) from ApplPerfStats c

Или попробуйте счетчик (*)

select count(*) from ApplPerfStats c

Ответ 5

Я столкнулся с этой проблемой, но в моем случае проблема возникла из-за версии gradle.
Когда я изменил свою систему с linux на mac, мне пришлось переключиться с gradle -1.0-milestone-3 на gradle -1.0-milestone-4 в качестве эталона -3 не работает в OSX. И в gradle -1.0-milestone-4 я столкнулся с той же проблемой, тогда мне пришлось деградировать мою версию gradle до gradle -1.0-milestone-1. Теперь он отлично работает

Ответ 6

Я тоже сталкивался с этой проблемой, исправленной этим...

Вы не объявили классы сущностей в файле конфигурации persistence.xml:

<property name="hibernate.archive.autodetection" value="class, hbm"/>

Ответ 7

Я знаю, что на это было долгое время, но ни один из вышеперечисленных ответов не решил мою проблему.

Я уже объявил объект в файле persistence.xml. В конце вся проблема заключалась в том, что имя объекта чувствительно к регистру в моей системе.

Этот jpql был неправильным

SELECT u FROM пользователь и WHERE userId = 1?

Но это хорошо работает

SELECT u FROM Пользователь и WHERE userId = 1?