2013-06-19 3 views
3

Я пытаюсь получить записи, используя запрос custome в репозитории SpringData. Я хочу использовать ключевое слово IN для извлечения объектов в соответствии с идентификаторами вложенного объекта. Ниже приведен мой класс репо.SpringData JPA коллекция спящего режима для ключевого слова IN

public interface BusinessRepository extends JpaRepository<Business, Long> { 
    @Query("SELECT t from Business t where t.address.addressid IN ? AND (t.businessType.text like ? or t.businessname like ?)") 
    ArrayList<Business> findAllByAddressAddressidInAndBusinessTypeTextLikeOrBusinessnameLike(ArrayList<Long> ids, String businessType, String businessName); 

Моя консоль отображает следующий текст.

Hibernate: select business0_.businessid as businessid0_, business0_.address_addressid as address9_0_, business0_.begdate as begdate0_, business0_.businessType_id as busines10_0_, business0_.businessname as business3_0_, business0_.contracttypeid as contract4_0_, business0_.multiuser as multiuser0_, business0_.statusid as statusid0_, business0_.urlreservos as urlreser7_0_, business0_.website as website0_, business0_1_.homePhone as homePhone2_, business0_1_.mobilePhone as mobilePh2_2_, business0_1_.primaryPhone as primaryP3_2_, business0_2_.businessdesc as business1_1_, business0_2_.pagetitle as pagetitle1_, business0_2_.tag as tag1_, business0_3_.userid as userid3_ from tbu1200 business0_ left outer join tbu1208 business0_1_ on business0_.businessid=business0_1_.id left outer join tbu1207 business0_2_ on business0_.businessid=business0_2_.id left outer join tbu1204 business0_3_ on business0_.businessid=business0_3_.businessid cross join vt1001 businessty1_ where business0_.businessType_id=businessty1_.id and (business0_.address_addressid in (?)) and (businessty1_.text like ? or business0_.businessname like ?) 
TRACE: org.hibernate.type.descriptor.sql.BasicBinder - binding parameter [1] as [BIGINT] - [1, 2] 

Это кажется правильным для меня. Я получаю следующее исключение.

java.lang.ClassCastException: java.util.ArrayList cannot be cast to java.lang.Long 
at org.hibernate.type.descriptor.java.LongTypeDescriptor.unwrap(LongTypeDescriptor.java:36) 
at org.hibernate.type.descriptor.sql.BigIntTypeDescriptor$1.doBind(BigIntTypeDescriptor.java:57) 
at org.hibernate.type.descriptor.sql.BasicBinder.bind(BasicBinder.java:92) 

Мой вопрос в том, почему он ожидает Долгое время, когда я использовал инструкцию IN. Он должен ожидать коллекцию. Если это что-то не поддерживается, что мне делать?

ответ

1

Почему вы добавляете примечание @Query?

Без указания запроса вручную он должен работать должным образом.

List<Company> findDistinctByUsers_loginIn(List<String> users) 

Я проверил, и такой код заканчивается без исключения. Единственная проблема заключается в том, что SpringData создает декартовую систему, и вам нужно добавить отдельный, чтобы она работала правильно.