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

IntelliJ IDEA не может разрешить сущность в spring данных jpa @query аннотация

Вот мой интерфейс repository:

public interface ContentRepository extends JpaRepository<Content, Long> {

    @Query(value = "select c from Content c where c.ContentCategory.genre =  :genre and c.ContentType.genre = :contentType")
    Iterable<Content> findByTypeAndCategory(@Param("contentType") String contentType, @Param("genre") String genre);

}

И вот Content POJO:

@Entity
@Table(name = "content")
public class Content implements Serializable {

public Content() {
}

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long id;

@ManyToOne
private ContentCategory contentCategory;

@ManyToOne
private ContentType contentType;

// other methods }

И вот мой applicationContext.xml:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xmlns:jpa="http://www.springframework.org/schema/data/jpa"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/tx
       http://www.springframework.org/schema/tx/spring-tx.xsd 
       http://www.springframework.org/schema/data/jpa
       http://www.springframework.org/schema/data/jpa/spring-jpa.xsd
       http://www.springframework.org/schema/context
       http://www.springframework.org/schema/context/spring-context.xsd">

<tx:annotation-driven/>
<context:component-scan base-package="com.aa.bb"/>
<jpa:repositories base-package="com.aa.bb.repository"/>


<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
    <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
    <property name="url" value="jdbc:mysql://localhost:3306/test1"/>
    <property name="username" value="root"/>
    <property name="password" value="2323"/>
</bean>

<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
    <property name="entityManagerFactory" ref="entityManagerFactory"/>
</bean>

<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
    <property name="dataSource" ref="dataSource"/>
    <property name="packagesToScan" value="com.tarameshgroup.derakht.repository"/>

    <property name="jpaVendorAdapter">
        <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
            <property name="database" value="MYSQL"/>
            <property name="showSql" value="true"/>
        </bean>
    </property>
    <property name="jpaProperties">
        <props>
            <prop key="hibernate.hbm2ddl.auto">update</prop>
        </props>
    </property>
</bean>

компилятор не может найти Content в @Query

4b9b3361

Ответ 1

IntelliJ IDEA не всегда разрешает сущность в аннотации jpa @query spring jpa @query, она разрешает ее во время выполнения, поскольку вы можете создавать/изменять объекты при запуске приложения, например. используя Hibernate создать и/или создать-drop. Там есть установка IntelliJ, которую необходимо установить правильно, чтобы не получить эту ошибку - см. Документацию IDEA IntelliJ.

Возможно, вам придется добавить быстрое исправление "Настройка JPA или Hibernate" в IntelliJ.

Другим возможным решением может быть использование NamedQuery в сущности POJO. Пример кода:

@NamedQueries(
 {          
 // AclEntries
 @NamedQuery(
      name = GET_CONTENT_BY_GENRE_AND_CONTENT_TYPE,
      query = "select c from Content c where c.ContentCategory.genre =  :genre and c.ContentType.genre = :contentType"
 )
 }
)
@Entity
@Table(name = "content")
public class Content implements Serializable {
public static final String GET_CONTENT_BY_GENRE_AND_CONTENT_TYPE = "Content.selecCfromContentWhereGenreAndContentType";
public Content() {
}
...
}

Вы используете его следующим образом:

List contentResults = entityManager.createNamedQuery(Content.GET_CONTENT_BY_GENRE_AND_CONTENT_TYPE)
.setParameter("genre", "parameter-genre-value")
.setParameter("contentType","parameter-contentType-value")
.getResultList();

Ответ 2

Три проблемы:

  • У вас нет фасет JPA (это подчеркивает тип содержимого в @Query в красном цвете)
  • Ваши пакеты установлены некорректно, packageToScan должен быть установлен в пакет объектов
  • Вы должны ссылаться на свойства в @Query, а не на типы (я вижу странный content.ContentCategory.genre в верхнем регистре)

После этого вы должны увидеть тип контента, разрешенный в @Query И иметь возможность правильно выполнить запрос

Ответ 3

Вы не указали пакет своей сущности. Убедитесь, что он находится в скане классов, который вы установили в applicationContext.xml

Ответ 4

Это может привести к нескольким вещам. Первое, что нужно попробовать, - убедиться, что вы правильно настроили JPA Facet:

  • Перейдите в раздел Структура проекта, выберите Модули и проверьте свой модуль в список имеет грань JPA. Если он не добавляет его.

  • Если это само по себе не помогает, попробуйте также посмотреть конфигурацию Spring. Вы показали, что пакет для сканирования объектов - com.tarameshgroup.derakht.repository

    <bean id="entityManagerFactory" class="..."> ... <property name="packagesToScan" value="com.tarameshgroup.derakht.repository"/>

    Однако это точный пакет, в котором находится объект (ваш код не отображается). У меня были проблемы с IDEA, где у меня есть подпакеты, и хотя приложение работает правильно, если я определяю пакет верхнего уровня, как у вас, IDEA автоматически не подбирает их для целей подсветки синтаксиса. Так, например, если у меня есть пакет com.foo.bar.domain с некоторыми объектами внутри, а также com.foo.bar.domain.subpkg и мой Spring config имеет значение packagesToScan только com.foo.bar.domain, тогда сущности в этом пакете будут иметь правильное выделение, но не подпакет. Ответ состоял в том, чтобы изменить Spring настроенное значение packagesToScan, чтобы включить подпакеты, даже если сам Spring не требует этого, т.е. com.foo.bar.domain, com.foo.bar.domain.subpkg

Ответ 5

public interface ContentRepository extends JpaRepository<Content, Long> {

@Query(value = "select c from Content c where c.ContentCategory.genre =  :genre and c.ContentType.genre = :contentType")
Iterable<Content> findByTypeAndCategory(@Param("contentType") String contentType, @Param("genre") String genre);

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

@Query(value = "select c from Content c where c.contentCategory.genre =  :genre and c.contentType.genre = :contentType")

У вас были типы (например, c. C ontentCategory), а не имена полей (например, c. c ontentCategory).

Ответ 6

c.contentCategory.genre

вместо

c.contentCategory.genre

и

c.contentType.genre

вместо

c.contentType.genre

Ответ 7

Приходят в голову два решения:

  • Создайте грань JPA с помощью параметра persistence.xml
  • Подключитесь к jdbc: mysql://localhost: 3306/test1 на вкладке базы данных (обычно на правой боковой панели)

Второе решение устранило большинство проблем, связанных с подсветкой запросов Intellij.