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
Trois problèmes:
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.
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();
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).
c.contentCategory.genre
au lieu
c.ContentCategory.genre
et
c.contentType.genre
au lieu
c.ContentType.genre
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.
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