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
Ответы
Ответ 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.