Org.springframework.data.repository return String

Hi,

Ich habe

public interface FooRepository extends PagingAndSortingRepository<Foo, Long> {

}

und natürlich ein Entity Foo.

@Entity
@Table(name="FOO")
@EntityListeners(AuditingEntityListener.class)
public class Foo implements Serializable {

  private static final long serialVersionUID = 1L;

  .... 

  @NaturalId
  @Column(nullable= false, length=255)
  @ApiModelProperty(notes = "The name of the Foo")
  protected String name;
  
 ....
}

Funktioniert alles super.

Jetzt will ich eine Funktion (zum obigen Repository) hinzufügen, was mir eine Liste aller Foo-Namen liefert. So etwa.

@Query(value = “SELECT f.name FROM Foo f”)
public List findFooNames();

Aber ich scheitere leider. Was ich bekomme ist.

Couldn't find PersistentEntity for type class java.lang.String

Ich bin sicher nicht der einzige, der das braucht. Aber irgendwie sind die Tipps rah oder sie funktionieren nicht. Z.B. ein Wrapper Entity um String bauen. Ich vermute aber, das geht irgendwie ganz einfach.
Irgendwelche Tipps? Wie geht das?

Danke, Thomas

Vielleicht mal mit Generics? public List<String> findFooNames();

Auch schon probiert. Ich hat’s oben nur aus versehen weg gelöscht.

Hi,

  1. Frage hast Du die Spring Boot Dev Tools Installiert?

  2. Wenn ja dann auf dem Interface probieren

    “findBy” tippen und dann Code Completion aufrufen (Je nach Eclipse/IntelliJ)…

  3. findByName

Weiterhin braucht man explizite @Query üblicherweise nicht…

Siehe auch : https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#repositories.query-methods.query-creation

Gruß
Karl Heinz Marbaise

Ich bin mir nicht ganz sicher, ob die Spring Repositories genutzt werden können, um einzelne Attribute abzufragen. Ich meine, die Arbeiten immer mit Entities.

Schreib einfach eine normale Query :slight_smile:

Ich konnte es jetzt soweit extrahieren:

@Query("SELECT b.name FROM BatchJob b where b.id = :id") 
String findAllBatchJobNames(@RequestParam(value="id") @Param("id") Long id);

“BatchJob SMSAuto”

@Query("SELECT b.name FROM BatchJob b") 
String findAllBatchJobNames(@RequestParam(value="id") @Param("id") Long id);

-> Errormsg: "query did not return a unique result: 8; nested exception is javax.persistence.NonUniqueResultException:

 @Query("SELECT b.name FROM BatchJob b") 
 List findAllBatchJobNames(@RequestParam(value="id") @Param("id") Long id);

-> Errormsg: “Couldn’t find PersistentEntity for type class java.lang.String!”

 @Query("SELECT b FROM BatchJob b") 
 List findBatchJobNameById(@RequestParam(value="id") @Param("id") Long id);

->Ergebnisliste

Wird genau ein String zurückgeben und die where-clause entsprechend gestaltet, funktioniert es.
Wird die where Bedingung entfernt (oder so gestaltet, dass mehr kommt), dann kommt fast erwartungsgemäß die Exception. Aber es gelingt mir momentan nicht eine List von Strings zurück zu liefern. Egal ob Plain, Generics, String, Optional, etc.
Liste an sich geht aber. Wenn ich komplette Entitys statt nur den Namen-String haben will, bekomme ich das.