Tengo un usuario de entidad JPA, que contiene una relación OneToMany con una entidad UserStats. Refactoricé el código existente para usar esta nueva entidad UserStats y, anteriormente, para administrar las características dependientes de la proporción de victorias, estaba almacenando la proporción de victoria dentro de la entidad Usuario como una propiedad.
Sin embargo, decidí que sería mejor simplemente tener un método que devolviera el índice de victoria, por lo que se implementó el cálculo de índice de victoria () en la entidad UserDetails.
Esto ha causado algunos problemas, por ejemplo, tenía un método de repositorio dentro de UserRepo:
List<User> findAllByOrderByVictoryRatioDesc();Ya no puedo buscar esto directamente en el repositorio, ya que el método VictoryRatio () está dentro de UserStats de la entidad Usuario, y no creo que pueda llamar a los métodos en un método de repositorio de todos modos.
Así que ahora estoy tratando de hacerlo dentro del servicio de usuario, pero no puedo resolverlo:
public List<User> getBestVSUsers() { List<User> users = userRepository.findAll(); for (User user: users ) { user.getUserStats().get(0).calculateVictoryRatio(); } }Pero necesito ordenar la lista anterior según el resultado de computeVictoryRatio().
También en mi interfaz React estaba renderizando esto:
const topUserList = users.map(user => { return <tr key={user.id}> <td style={{ whiteSpace: 'nowrap' }} class="player-list-key-text">{user.name}</td> <td className="player-list-key-text">{user.username}</td> <td className="player-list-key-text"><span className="defeats">{user.victories}</span></td> <td className="player-list-key-text"><span className="victories">{user.defeats}</span></td> <td className="player-list-key-text"><span className="victory-score">{user.victoryRatio}</span></td> </tr> });¿Cómo puedo representar el índice de victoria, las derrotas y las victorias como se indica arriba ahora que están encapsulados dentro de la entidad UserStats? ¿Necesito hacer una búsqueda separada y combinar los 2? O puedo hacer algo como:
{usuario.userStats[0].victorias}
¿Cómo puedo hacer esto? ¿Hay una mejor manera de hacer esto? ¿Puedo llamar a métodos dentro del userRepo?
Gracias por la ayuda
Prueba algo como esto:
PageRequest pageRequest = new PageRequest(pageNumber, pageSize, new Sort(new Order(Direction.DESC, "ORDER BY (VICTORIES/DEFEATS)")) Page page = myRepository.findAll(specification, pageRequest);Donde en ORDEN POR puede poner su fórmula de proporción. En este caso, ponemos el cálculo en su SGDB.
Puede realizar un pedido en una entidad relacionada siempre que se una a esa entidad en la consulta. Es posible que deba definir una consulta personalizada en su repositorio.
@Query("SELECT u from User u JOIN u.userStats us ORDER BY us.victoryRatio") List<User> findAllCustomSort(); Sin embargo, obviamente el motor de la base de datos hace la clasificación aquí, independientemente de su código. No nos ha mostrado el contenido de su método de calculateVictory de la victoria, pero si debe ordenar en función de un cálculo que realiza en el código, no funcionará. Dudo que este sea el caso, ya que solo está hablando de mover la proporción a otra entidad, no de comenzar a calcularla. Pero si es así, por supuesto, siempre puede simplemente ordenar la lista en la memoria. Teniendo en cuenta que no está utilizando la paginación, esto tampoco sería tan malo.
O si es absolutamente necesario ordenar en la base de datos, entonces no creo que tenga más remedio que crear una función personalizada para ello en la base de datos. Sin embargo, eso iría un poco más allá del alcance de esta pregunta.