2017-08-01 2 views
1

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.

+0

Yuo peut obtenir le OrderEntity OrderOptionEntity. Ça marchera? –

Répondre

2

Vous avez probablement oublié le mot clé In dans votre méthode de requête.

Essayez cette

public interface OrderRepository extends JpaRepository<OrderEntity, Long> { 

    List<OrderEntity> findAllByOptionsIn(List<OrderOptionEntity> options); 

} 

Jetez un oeil à la docs.

+0

Merci, j'ai lu. Mais Il émet la même exception: org.springframework.orm.jpa.JpaSystemException: le texte de SqlNode n'a pas référencé le nombre attendu de colonnes; l'exception imbriquée est org.hibernate.HibernateException: le texte de SqlNode n'a pas référencé le nombre attendu de colonnes –

+0

La colonne sur laquelle vous vous connectez est-elle correcte 'joinColumns = @JoinColumn (name =" order_id ")'? –

+0

Pouvez-vous s'il vous plaît déboguer le code et afficher la requête qui s'exécute ?! –