j'ai une entité Order
avec Liste des options à l'intérieur, comme celui-ci:botte de printemps JPA: entités de recherche par champ qui représentent la liste des objets incorporés
@Entity
@Table(name = "orders")
public class OrderEntity extends AuditableEntity {
private Long passengerId;
private OrderType type;
private OrderStatus status;
@ElementCollection()
@CollectionTable(name = "options", joinColumns = @JoinColumn(name = "order_id"))
private List<OrderOptionEntity> options = new ArrayList<>(0);
...
Je veux trouver toutes les commandes, correspond à la liste déterminée options J'utilise JpaRepository<OrderEntity, Long>
pour les opérations CRUD. Malheureusement, quand j'ajoute méthode findByOptions
, comme ceci:
public interface OrderRepository extends JpaRepository<OrderEntity, Long> {
List<OrderEntity> findAllByOptions(List<OrderOptionEntity> options);
}
dans les tests lancers francs
texte de SqlNode ne faisaient pas référence nombre attendu de colonnes;
Alors maintenant je fais juste findAll()
et filtre toutes les commandes manuellement. Existe-t-il un moyen plus élégant pour obtenir des entités, en faisant correspondre par tous les éléments de la liste à l'intérieur?
MISE À JOUR: Quand je lance
@Query("SELECT ord FROM OrderEntity ord WHERE :options MEMBER OF ord.options")
List<OrderEntity> findAllByOptions(@Param(value = "options") List<OrderOptionEntity> options);
Il fonctionne très bien, mais seulement si ord.options et options requête a une taille 1, si plus - il jette
ohengine .jdbc.spi.SqlExceptionHelper: argument non valide dans JDBC appel: indice de paramètre hors plage: 3
SQL est généré
/* SELECT
ord
FROM
OrderEntity ord
WHERE
:options MEMBER OF ord.options */ select
orderentit0_.id as id1_3_,
orderentit0_.version as version2_3_,
orderentit0_.create_time as create_t3_3_,
orderentit0_.update_time as update_t4_3_,
orderentit0_.comment as comment5_3_,
orderentit0_.distance_to_order as distance6_3_,
orderentit0_.passenger_id as passenge7_3_,
orderentit0_.price as price8_3_,
orderentit0_.route_distance as route_di9_3_,
orderentit0_.status as status10_3_,
orderentit0_.type as type11_3_
from
orders orderentit0_
where
(
? , ?
) in (
select
options1_.key,
options1_.value
from
options options1_
where
orderentit0_.id=options1_.order_id
)
Tout ce que je veux - obtenir tous les ordres, contenant un sous-ensemble d'options.
Yuo peut obtenir le OrderEntity OrderOptionEntity. Ça marchera? –