web-dev-qa-db-fra.com

IntelliJ IDEA impossible de résoudre l'entité dans les données de printemps

Voici mon interface 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);

}

Et voici 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 }

Et voici mon 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>

le compilateur ne trouve pas Content dans @Query

22
CVV

Trois problèmes:

  1. Vous n'avez pas activé la facette JPA (c'est ce qui souligne le type de contenu dans @Query en rouge)
  2. Vos packages ne sont pas définis correctement, packageToScan doit être défini sur votre package d'entités
  3. Vous devez référencer les propriétés dans @Query, pas les types (je vois bizarre content.ContentCategory.genre en majuscule)

Ensuite, vous devriez voir le type de contenu résolu dans @Query ET pouvoir exécuter votre requête correctement.

2
rdlopes

IntelliJ IDEA ne résout pas toujours l'entité dans l'annotation jpa @query de données print, mais le résout au moment de l'exécution, car vous pouvez créer/modifier des entités au démarrage de votre application, par exemple. Utilisation de Hibernate créer et/ou créer-déposer. Un paramètre IntelliJ doit être défini correctement pour ne pas obtenir cette erreur - voir IDEA la documentation d'IntelliJ.

Vous devrez peut-être ajouter la solution rapide "Configurer JPA ou Hibernate" dans IntelliJ.

Une autre solution possible peut utiliser NamedQuery dans l'entité POJO. Exemple de code:

@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() {
}
...
}

Vous l'utilisez comme ceci:

List contentResults = entityManager.createNamedQuery(Content.GET_CONTENT_BY_GENRE_AND_CONTENT_TYPE)
.setParameter("genre", "parameter-genre-value")
.setParameter("contentType","parameter-contentType-value")
.getResultList();
1
Binyamin Regev
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);

Je suis à peu près sûr qu'il y a un problème de capitalisation:

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

Vous aviez les types (par exemple, c.ContentCategory), pas les noms de champ (par exemple, c. c ontentCategory).

0
Kristian H
c.contentCategory.genre

au lieu

c.ContentCategory.genre

et 

c.contentType.genre

au lieu

c.ContentType.genre
0
Jakub Pomykała

Vous n'avez pas cité le package de votre entité. Assurez-vous qu'il est bien dans l'analyse du chemin d'accès aux classes que vous avez définie dans applicationContext.xml.

0
rainerhahnekamp

Cela peut être causé par quelques facteurs. La première chose à faire est de vous assurer que vous avez correctement configuré une facette JPA:

  • Accédez à Structure de projet, sélectionnez Modules et vérifiez que votre module dans la liste Possède une facette JPA. Si ce n'est pas le cas, ajoutez-en un.

  • Si cela ne vous aide pas, essayez également de regarder votre config de printemps. Vous avez montré que le (s) paquet (s) à analyser des entités est com.tarameshgroup.derakht.repository  

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

    Cependant, c'est le paquet exact dans lequel l'entité réside (votre code ne s'affiche pas). J'ai eu IDEA des problèmes pour lesquels j'ai des sous-packages et bien que l'application s'exécute correctement si je définis le package de niveau supérieur comme vous l'avez fait, IDEA ne les prend pas automatiquement à des fins de mise en évidence de la syntaxe . Ainsi, par exemple, si j'ai le package com.foo.bar.domain avec certaines entités dans, ainsi que com.foo.bar.domain.subpkg et que ma configuration Spring a une valeur packagesToScan de com.foo.bar.domain, les entités de ce package auront une mise en évidence correcte, mais pas le sous-package. La solution consistait à changer la valeur packagesToScan de Spring configuré pour inclure les sous-packages, même si Spring ne le requiert pas, c'est-à-dire com.foo.bar.domain, com.foo.bar.domain.subpkg

0
D.C.