Spring Data JPA Distinto, Devolver los resultados de una sola columna

Tengo algunos datos que contiene un STATE campo (Cadena de Texto) que define lo que el estado de una solicitud es actualmente (por ejemplo, pendiente, aprobado negado etc.) y para conseguir que todos los valores únicos de la columna I se puede ejecutar la siguiente consulta TSQL

SELECT DISTINCT STATE FROM CALLOUT_REQUEST

donde CALLOUT_REQUEST es mi nombre de la tabla y STATE ser el campo que devuelve algo como:

ESTADO

  • aprobado
  • negó
  • pendiente

Sin embargo no entiendo cómo iba a convertir en una consulta en mi repositorio, como parece que necesito un «por» declaración » o algún otro mecanismo de filtrado que me puede conseguir el STATE basada en?

Lo que estoy buscando para volver – como se muestra en la materia prima consulta TSQL arriba – es algún tipo de Lista o un objeto Array que contiene todos los único/valores distintos en todos los STATE campos.

Así en pseudo-código, creo que estoy buscando algo como esto:

String[] states = repository.findDisinctState();

donde findDistinctState() sería entonces devolver un array de tipo.

Esperanza de que tiene sentido, soy muy nuevo en Java y Spring, en general, me parece que me estoy perdiendo algo de conocimiento conceptual de utilizar la anterior.

ACTUALIZACIÓN:

El «estado», concepto está cerrado, así que yo podría implementar que como una enumeración – el único problema es que no sé cómo hacer eso 🙂 Enfermo miren cómo puedo hacer eso, ya que creo que encaja perfectamente con lo que estoy tratando de lograr.

La Lista de recibo de la consulta siempre es destinado a ser utilizado para obtener un recuento de todas las apariciones. Yo tenía este código antes de obtener un recuento total para cada uno de los ‘estados’:

Map stats = new HashMap();
String[] states = {"approved", "denied", "pending", "deactivated"};
for (int i = 0; i < states.length; i++) {
    stats.put(states[i], repository.countByState(states[i]));
}

Estoy correcto en el entendimiento de que los estados Array que tengo en el anterior fragmento de código se podría convertir en una enumeración y entonces yo aún no necesita la costumbre @Query más?

2 Kommentare

  1. 8

    Si que state concepto está cerrado y usted sabe que es un posible conjunto de valores, debe ser una enumeración.

    Después de que usted puede crear consultas que se invoca como:

    repository.findByState(State.APPROVED)

    Si usted no puede crear un enum, se necesita un método separado para obtener los valores distintos, que no pueden ser proporcionados por JPA, porque se necesita una lista de cadenas y no una lista de CalloutRequests.
    A continuación, deberá especificar una consulta de forma manual como:

    @Query("SELECT DISTINCT State FROM CALLOUT_REQUEST")
    List<String> findDistinctStates();
    • He actualizado a la pregunta de ¿por qué me pidió la consulta personalizada inicialmente para demostrar que tengo que usar esto para obtener un recuento de los Distintos valores devueltos.
    • No veo el problema de la creación de una enumeración. Sólo tienes que crear uno con todos los posibles valores: docs.oracle.com/javase/tutorial/java/javaOO/enum.html, a Continuación, crear un campo bajo CalloutRequest de que tipo enum. Por último, anotar con: @Enumerados(EnumType.Cadena) tomee.apache.org/examples-trunk/jpa-enumerated/README.html
    • El hecho de que esta es mi primera aplicación en Java es el problema, yo simplemente no sabía cómo hacerlo, pero gracias por aclarar.
    • Que está bien. Si necesitas ayuda me puedes enviar un ejemplo
    • Esto no funciona para mí, me sale el error Couldn't find PersistentEntity for type class java.lang.String. Al parecer, usted no puede devolver una lista de cadenas desde el repositorio.
  2. 3

    Puede utilizar una consulta JPQL para esto, con la @org.springframework.data.jpa.repository.Query anotación:

    @Query("select distinct state from CalloutRequest")
    List<String> findDistinctStates();
    • Esta respuesta es correcta, así como lo hace responder el título de mi pregunta. Mi razón para el marcado de @Luis Soares respuesta correcta era sólo debido al hecho de que expandió la solución y se proporciona orientación sobre la enumeración enfoque. Gracias –

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea