J’utilise Spring JPA pour effectuer toutes les opérations de firebase database. Cependant, je ne sais pas comment sélectionner des colonnes spécifiques d’une table dans Spring JPA?
Par exemple: SELECT projectId, projectName FROM projects
Vous pouvez définir nativeQuery = true dans l’annotation @Query partir d’une classe de Repository comme celle-ci:
public static final Ssortingng FIND_PROJECTS = "SELECT projectId, projectName FROM projects"; @Query(value = FIND_PROJECTS, nativeQuery = true) public List
Notez que vous devrez cependant faire la cartographie vous-même. Il est probablement plus facile de simplement utiliser la recherche mappée normale à moins que vous ayez vraiment besoin de ces deux valeurs:
public List findAll()
Cela vaut probablement aussi la peine de regarder les documents de données de Spring.
Je n’aime pas la syntaxe en particulier (elle a l’air un peu piratée …) mais c’est la solution la plus élégante que j’ai pu trouver (elle utilise une requête JPQL personnalisée dans la classe de référentiel JPA):
@Query("select new com.foo.bar.entity.Document(d.docId, d.filename) from Document d where d.filterCol = ?1") List findDocumentsForListing(Ssortingng filterValue);
Bien entendu, il vous suffit de fournir un constructeur pour Document qui accepte docId & filename comme arguments du constructeur.
Vous pouvez utiliser les projections de Spring Data JPA (doc) . Dans votre cas, créez l’interface:
Dans mon cas, j’ai créé une classe d’entités distincte sans les champs qui ne sont pas requirejs (uniquement avec les champs requirejs).
Mappez l’entité à la même table. Maintenant, lorsque toutes les colonnes sont requirejses, j’utilise l’ancienne entité, lorsque seules certaines colonnes sont requirejses, j’utilise l’entité lite.
@Entity @Table(name = "user") Class UserLite{ @Column(name = "id", unique=true, nullable=false) int id; @Column(name = "name", nullable=false) Ssortingng name; }
Cela fonctionne lorsque vous connaissez les colonnes à récupérer (et cela ne va pas changer).
ne fonctionnera pas si vous avez besoin de décider dynamicment les colonnes.
Dans ma situation, je n’ai besoin que du résultat json, et cela fonctionne pour moi:
public interface SchoolRepository extends JpaRepository { @Query("select s.id, s.name from School s") List
dans le contrôleur:
@Autowired private SchoolRepository schoolRepository; @ResponseBody @RequestMapping("getschoolidandname.do") public List
Je suppose que la méthode la plus simple consiste à utiliser QueryDSL , qui accompagne Spring-Data.
En utilisant à votre question la réponse peut être
JPAQuery query = new JPAQuery(entityManager); List result = query.from(projects).list(project.projectId, project.projectName); for (Tuple row : result) { System.out.println("project ID " + row.get(project.projectId)); System.out.println("project Name " + row.get(project.projectName)); }}
Le gestionnaire d’entités peut être Autowired et vous travaillerez toujours avec des objects et des classes sans utiliser le langage * QL.
Comme vous pouvez le voir dans le lien, le dernier choix semble, presque pour moi, plus élégant, à savoir utiliser DTO pour stocker le résultat. Appliquez à votre exemple qui sera:
JPAQuery query = new JPAQuery(entityManager); QProject project = QProject.project; List dtos = query.from(project).list(new QProjectDTO(project.projectId, project.projectName));
Définir ProjectDTO comme:
class ProjectDTO { private long id; private Ssortingng name; @QueryProjection public ProjectDTO(long projectId, Ssortingng projectName){ this.id = projectId; this.name = projectName; } public Ssortingng getProjectId(){ ... } public Ssortingng getProjectName(){....} }
Using Spring Data JPA there is a provision to select specific columns from database ---- In DAOImpl ---- @Override @Transactional public List getAllEmployee() throws Exception { LOGGER.info("Inside getAllEmployee"); List empList = empRepo.getNameAndCityOnly(); return empList; } ---- In Repo ---- public interface EmployeeRepository extends CrudRepository { @Query("select e.name, e.city from Employee e" ) List getNameAndCityOnly(); } It worked 100% in my case. Thanks.
Il est possible de spécifier null comme valeur de champ dans sql natif.
@Query(value = "select p.id, p.uid, p.title, null as documentation, p.ptype " + " from projects p " + "where p.uid = (:uid)" + " and p.ptype = 'P'", nativeQuery = true) Project findInfoByUid(@Param("uid") Ssortingng uid);
Vous pouvez appliquer le code ci-dessous dans votre classe d’interface de référentiel.
entityname signifie le nom de votre table de firebase database comme les projets. Et List signifie que Project est une classe d’entité dans vos projets.
@Query(value="select p from #{#entityName} p where p.id=:projectId and p.projectName=:projectName") List findAll(@Param("projectId") int projectId, @Param("projectName") Ssortingng projectName);
Vous pouvez utiliser JPQL:
TypedQuery query = em.createQuery( "SELECT p.projectId, p.projectName FROM projects AS p", Object[].class); List results = query.getResultList();
ou vous pouvez utiliser la requête SQL native.
Query query = em.createNativeQuery("sql statement"); List results = query.getResultList();
En utilisant la requête native:
Query query = entityManager.createNativeQuery("SELECT projectId, projectName FROM projects"); List result = query.getResultList();
La plupart des réponses suggèrent d’utiliser des variantes de la requête SQL native. Cependant, en utilisant jp-data intégré jpa nous pouvons également y parvenir:
Vous devez simplement utiliser la signature de méthode suivante dans la classe Repository.
Selon le schéma, il peut renvoyer une liste ou une seule instance. Cette approche peut être appliquée à une ou plusieurs colonnes, comme indiqué ci-dessus.
Pour votre exemple, cela pourrait être quelque chose comme: