2015-04-01 3 views
1

У меня возникла проблема с использованием JPA, а более конкретно - с использованием предложения IN.JPA use IN с объектами

Лучше всего, я думаю, чтобы показать вам мой код:

@NamedQuery(name = "Commande.findCustom", query = "SELECT DISTINCT [myFields] " 
      + "FROM Commande c WHERE " 
      + "[SomeCriterias] AND " 
      + "c.ID IN (SELECT t.ID FROM SubTable t " 
      + "WHERE t.IDX IN :param) AND [otherCriterias]"), 

Затем я получаю сообщение об ошибке с MySQL:

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '.ID FROM SubTable t1 WHERE (t1.IDX IN (168)' 

Я ищу ответ, но не может найти что-нибудь ...

Я привязал удалить пункт IN, проблема все та же (так что это не двойной IN проблемы использования)

my :param - это список объектов, которые я получил с помощью метода Object.find(). Как вы можете видеть, он возвращает идентификатор (168). Но я не могу найти проблему ...

Любая помощь будет принята с благодарностью, спасибо

EDIT: Полный запрос

@NamedQuery(name = "Commande.findCustom", query = "SELECT DISTINCT c.idChargement, c.libelle, " 
      + "c.codeTransporteur, c.reference, c.dateCreation, c.dateChargementPrevu, " 
      + "c.dateValidationChargement, c.dateLivraisonPrevue, c.codeDestinataire, " 
      + "c.raisonSocialeDestinataire, c.adresseDestinataire, c.codePostalDestinataire, " 
      + "c.villeDestinataire, c.paysDestinataire, c.contactDestinataire, " 
      + "c.telephoneDestinataire, c.mailDestinataire, c.poidsCommande, c.nombreColis, " 
      + "c.nombreUniteManutention, c.typeUniteManutention, c.prendreRDV, c.commentaires " 
      + "FROM Commande c WHERE " 
      + "c.idChargement = :idChargement AND c.codeTransporteur = :codeTransporteur AND " 
      + "(c.dateCreation BETWEEN :dateDebut AND :dateFin) AND " 
      + "c.idDernierStatut IN (SELECT l.idListeStatutsCommande FROM Listestatutscommande l " 
      + "WHERE l.idStatut IN :idStatut) AND c.raisonSocialeDestinataire = :raisonSociale AND " 
      + "c.adresseDestinataire = :adresseDestinataire AND c.codeDestinataire = :codeDestinataire " 
      + "AND c.codePostalDestinataire = :codePostal AND c.villeDestinataire = :villeDestinataire " 
      + "AND c.paysDestinataire = :codePays") 

и сообщение об ошибке

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '.idListeStatutsCommande FROM listestatutscommande t1 WHERE (t1.IdStatut IN (168)' 
+0

Вы используете его с внедрением в качестве спящего режима? –

+0

@PrasadKharkar Нет, я не, я проверил проблему со скобкой, это тоже не так ... – trichetriche

+0

Я бы сказал, что что-то не так с '.ID' не с' IN'clause – Antoniossss

ответ

0

Хорошо, поэтому я нашел проблему, а затем ответ. Спасибо @Antoniossss, факт в том, что я искал неправильную часть запроса.

Ошибка здесь: c.idDernierStatut IN ...

Дело в том, что эта часть является внешним ключом. И когда вы хотите найти его, вы должны рассматривать его как объект. Поэтому для получения идентификатора правильной формы является c.idDernierStatut.idListeStatutsCommande IN.

Спасибо вам обоим за ваше время в любом случае!

+0

хорошо, что вы могли бы решить. Он называется выражением пути. в JPQL мы имеем дело с объектами, а не с таблицами базы данных, поэтому вам придется проходить через свойства объекта. Счастливое обучение. –

+0

@PrasadKharkar Я действительно изучаю это, это полезный совет. Спасибо – trichetriche

+0

мой блог ...... должен быть полезен http://www.thejavageek.com/jpa-tutorials/ –

1

Как вы получаете ошибку от MYSQL не Hibernate, вы можете попытаться выяснить, какой запрос на самом деле i сгенерировано. Чтобы сделать это, используйте proxy invoker, например p6spy, и тогда все должно быть ясно. Проверьте p6spy site. Когда вы это сделаете, попытайтесь вызвать такой сгенерированный SQL самостоятельно и попытайтесь его исправить. Я использовал такой метод, когда у меня были некоторые проблемы с использованием попыток объединения JPA и т. Д. Очень полезно при диагностике таких проблем.

+0

даже я должен был следовать тому же подходу, изучая jpql. Хорошее предложение. Выполнить из e. –