Requête personnalisée au Printemps JPA Référentiel avec la Pagination
J'ai essayé la mise en œuvre de JPA Référentiel avec le Printemps de Démarrage il fonctionne très bien.
Maintenant, si j'essaie de mettre en œuvre de requête personnalisés dans l'interface qui s'étend JpaRepository à l'aide de @Requête Annotation, il fonctionne très bien retourne la Liste de haricots.(à l'aide de NamedQuery).
Maintenant, quand j'essaie d'utiliser la pagination pour la méthode personnalisée/requête qui ne fonctionne pas.
Code :
Contrôleur :
@RequestMapping("/custompages/{pageNumber}")
public String getAllEmployeesUsingNamedQueryWithPaging(@PathVariable Integer pageNumber,Model model)
{
Page<Employee> page = employeeService.getAllEmployeesUsingNamedQueryWithPaging(pageNumber);
System.out.println("current page "+page);
System.out.println("current page content"+page.getContent());
int current = page.getNumber() + 1;
int begin = Math.max(1, current - 5);
int end = Math.min(begin + 10, page.getTotalPages());
model.addAttribute("empList", page.getContent());
model.addAttribute("empPages", page);
model.addAttribute("beginIndex", begin);
model.addAttribute("endIndex", end);
model.addAttribute("currentIndex", current);
return "employeeWorkbench";
}
Service
@Override
public Page<Employee> getAllEmployeesUsingNamedQueryWithPaging(Integer
pageNumber) {
PageRequest pageRequest =
new PageRequest(pageNumber - 1, PAGE_SIZE,
Sort.Direction.ASC, "id");
return
employeeDao.getAllEmployeesUsingNamedQueryWithPaging(pageRequest);
}
Dao
@Transactional
public interface EmployeeDao extends JpaRepository<Employee, Long>{
@Query(name="HQL_GET_ALL_EMPLOYEE_BY_ID")//Works Fine
public List<Employee> getEmpByIdUsingNamedQuery(@Param("empId") Long
empId);
@Query(name="HQL_GET_ALL_EMPLOYEE") //throws exception
public Page<Employee> getAllEmployeesUsingNamedQueryWithPaging(Pageable
pageable);
}
NamedQuery
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD
3.0//EN"
"http://hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<query name="HQL_GET_ALL_EMPLOYEE">from Employee</query>
<query name="HQL_GET_ALL_EMPLOYEE_BY_ID">from Employee where id =
:empId</query>
</hibernate-mapping>
Exception : java.lang.IllegalArgumentException: Type spécifié pour
TypedQuery [java.lang.Longue] est incompatible avec le type de retour de la requête
[la classe com.mobicule.SpringBootJPADemo.les haricots.L'employé]
Je veux juste avoir de la pagination de la fonctionnalité fournie par Spring JPA Référentiel de méthodes personnalisées et de requête.
Comment puis-je y parvenir?
@Query("from Employee")
faut-il changer le comportement? aussi l' @Transactional sur le référentiel est redondante. Également pour les requêtes c'est simple, vous seriez mieux d'utiliser simplement le findAll
le référentiel a déjà.aussi l'erreur est ce qui implique que pour une raison quelconque (pas évident pour moi), il pense que la requête spécifiée doit retourner une Longue et non des Employés
Merci pour la réponse. J'ai essayé avec simplement @Query("Employee"), mais cela m'a fait une Liste<Employé> et PAS<Employé>. Ma motivation est d'utiliser JpaRepositories construire dans la Fonctionnalité de Pagination Pour mes requêtes personnalisées. Et comme vous l'avez dit, j'ai utilisé findAll cela fonctionne bien avec pas de questions, même fonctionne bien avec la pagination.mais je veux avoir les mêmes fonctionnalités pour mes requêtes personnalisées.
J'ai cherché pour cette question, j'ai connu que lorsque JpaRepository exécute sa méthode findAll,findBy......etc avec la pagination, il passe à 2 requêtes ---pour le comte et les autres pour les données réelles.
oui ce comte est intentionnel... donc il sait combien de pages il est. Si vous avez le type de retour spécifié comme
Page<Employee>
vous ne devriez pas obtenir une Liste, vous ne devriez obtenir une Liste si vous demandez une Liste ou d'une sous-interface de Liste (comme objet iterable)OriginalL'auteur ashish | 2015-08-06
Vous devez vous connecter pour publier un commentaire.
Je ne sais pas pourquoi, mais pour une raison tout simplement de faire
from Entity
la cause de la "id" est de retour, à la place, vous devrez fournir à l'entité retournée dans la sélection, commeselect f from Foo f
J'ai reçu le même message d'erreur, avec juste
from Foo
. Je crois aussi que vous pouvez faire référence à ces par nom pour le fichier xml que vous avez été. voici mon code completd'autres tests dit que
from Foo f
fonctionne aussi, je ne sais pas pourquoi l'alias est nécessaire, c'est peut-être une partie de la JPQL spec.Ici est un test qui montre comment faire simple pagination, tri par une propriété et le tri par plusieurs propriétés
vous devez faire cette votre réponse, upvotes sont sympas aussi
s'il vous plaît regardez cette.. stackoverflow.com/questions/32434058/...
si cela fonctionne cela ne veut pas vraiment expliquer ce qui s'est passé ici, autre que le "bug". J'ai plusieurs paginé spécifications et
@Query
ainsi que la simple méthode de l'analyseur. Tout ce que je peux dire c'est que je reçois trop l'exception décrite dans le askers post.oh le regarder à nouveau qui est en train de faire un tri par DESC, la mienne est de permettre de modifier le tri avec un PageRequest
OriginalL'auteur xenoterracide