Comment ajouter de la méthode personnalisée pour Spring Data JPA
Je suis à la recherche dans Spring Data JPA. Considérons l'exemple ci-dessous où je vais obtenir toutes les impuretés et finder fonctionnalités de travail par défaut et si je veux personnaliser un doigt, puis qui peut être fait aussi facilement dans l'interface elle-même.
@Transactional(readOnly = true)
public interface AccountRepository extends JpaRepository<Account, Long> {
@Query("<JPQ statement here>")
List<Account> findByCustomer(Customer customer);
}
Je voudrais savoir comment puis-je ajouter une complète et sur mesure de la méthode de sa mise en œuvre pour le dessus de AccountRepository? Depuis son Interface, je ne peut pas mettre en œuvre la méthode.
Vous devez vous connecter pour publier un commentaire.
Vous avez besoin de créer une interface personnalisée méthodes:
et de fournir une implémentation de la classe pour cette interface:
Voir aussi:
4.6 des Implémentations Personnalisées pour le Printemps Référentiels de Données
Noter que le schéma de nommage a changé entre les versions. Voir https://stackoverflow.com/a/52624752/66686 pour plus de détails.
AccountRepositoryImpl
pas:AccountRepositoryCustomImpl
, etc. - il est très stricte de la convention de nommage.findByFooAndBar()
. Je n'ai pas pensé à simplement injecter le référentiel (qui s'étend déjà présent) dans l'impl personnalisé, car il se sent comme qui permettrait de créer une référence circulaire ou quelque chose? mais ça marche alors...Error creating bean with name 'accountRepositoryImpl': Bean with name 'accountRepositoryImpl' has been injected into other beans [accountRepository] in its raw version as part of a circular reference, but has eventually been wrapped.
QueryDslRepositorySupport
QueryDslRepositorySupport
Vous devez également injecter le référentiel via la zone ou l'injection par mutateur plutôt que constructeur d'injection sinon il ne sera pas en mesure de créer de la fève. Il semble que le travail, mais la solution se sent un peu "sale", je ne sais pas si il y a des plans pour améliorer la façon dont cela fonctionne de la source de Données de l'équipe.En plus de axtavt de réponse, n'oubliez pas que vous pouvez injecter de l'Entité Gestionnaire dans votre personnalisé de mise en œuvre si vous en avez besoin pour construire vos requêtes:
C'est limité dans son usage, mais pour de simples méthodes personnalisées vous pouvez utiliser par défaut de l'interface des méthodes comme:
EDIT:
Dans ce printemps tutoriel il est écrit:
Il est même possible de simplement déclarer méthode comme:
et si l'objet
Hobby
est une propriété du Client alors que le Printemps sera automatiquement définir la méthode pour vous.La accepté de répondre fonctionne, mais a trois problèmes:
AccountRepositoryImpl
. Le la documentation indique clairement qu'il doit être appeléAccountRepositoryCustomImpl
, l'interface personnalisée du nom plusImpl
@Autowired
, qui sont considéré comme une mauvaise pratiqueJ'ai trouvé un moyen pour le rendre parfait, mais pas sans l'aide d'un autre sans-papiers de Données du Printemps fonctionnalité:
accountRepositoryBasic
). Sinon, le printemps s'est plaint de l'existence de 2 haricot de choix pour l'injection dans mon*Impl
constructeur.AccountRepositoryBasic
etAccountRepositoryCustom
sera disponible via l'injection d'uneAccountRepository
Im en utilisant le code suivant pour accéder généré trouver des méthodes de mon custom de mise en œuvre. L'obtention de la mise en œuvre par le bean factory empêche circulaire bean problèmes de création.
Compte tenu de votre extrait de code, veuillez noter que vous ne pouvez passer des objets Natifs de la findBy### méthode, permet de dire que vous voulez charger une liste de comptes qui appartient à certains clients, une solution est de faire cela,
Faire sue le nom de la table à interroger est la même que la classe d'Entité.
Pour de plus amples mise en application, veuillez jeter un oeil à cette
Si vous voulez être en mesure de faire des opérations plus sophistiquées, vous pourriez avoir besoin d'accéder aux Données du Printemps-même, dans ce cas, les travaux suivants (comme ma solution provisoire à DATAJPA-422):
Il y a une autre question à examiner ici. Certaines personnes pensent que l'ajout de méthode personnalisée à votre référentiel automatiquement les exposer comme des services RESTE sous '/la recherche de lien. Ce n'est malheureusement pas le cas. Le printemps ne prend pas en charge actuellement.
C'est "by design", un printemps de données reste explicitement vérifie si la méthode est une méthode personnalisée et ne pas l'exposer comme un RESTE de lien de recherche:
C'est un qoute de Oliver Gierke:
Pour plus de détails, voir cette question: https://jira.spring.io/browse/DATAREST-206
@RestResource(path = "myQueryMethod")
annotation à la méthode. La citation ci-dessus est simplement en indiquant que le Printemps ne sais pas comment vous voulez qu'il mappé (c'est à dire OBTENIR vs POST etc.) donc, c'est à vous de le préciser via l'annotation.Comme il est spécifié dans le documenté fonctionnalité, à l'aide de la
Impl
préfixe nous permet d'avoir une assez propre solution:@Repository
interface, direMyEntityRepository
, soit au Printemps de Données des méthodes ou des méthodes personnaliséesMyEntityRepositoryImpl
(leImpl
suffixe est la magie) n'importe où (n'a même pas besoin d'être dans le même package) qui implémente les méthodes personnalisées seulement et annoter telle classe avec@Component
** (@Repository
ne de travail).MyEntityRepository
via@Autowired
pour une utilisation dans les méthodes personnalisées.Exemple:
Classe d'entité:
Référentiel d'interface:
Personnalisé méthodes de mise en œuvre de haricot:
Les petits inconvénients, j'ai identifiés sont les suivants:
Impl
classe sont marqués comme non utilisés par le compilateur, donc la@SuppressWarnings("unused")
suggestion.Impl
classe. (Alors que dans l'ordinaire de fragment d'interfaces mise en œuvre les documents suggèrent vous pourriez avoir beaucoup.)I étend le SimpleJpaRepository:
et ajoute cette classe de @EnableJpaRepositoryries repositoryBaseClass.