2016-12-28 2 views
0

Почему этот запрос не работает?Hibernate JOIN запрос не работает: Java/JSP с Hibernate, IDE Netbeans/GlassFish, Windows 10

query = "SELECT itm.itemId, itm.itemModel, itm.itemDescription, " 
      + " itmImages.imageFileName, part.participant_id " 
      + " FROM Users user " 
      + " INNER JOIN user.participant part " 
      + " INNER JOIN part.addresses addr " 
      + " INNER JOIN part.item itm "  
      + " INNER JOIN itm.itemImages itmImages " 
      + " WHERE user.userType LIKE '%borrow%') AND itm.itemDescription LIKE '%mower%') AND addr.addressType = 'primary'"; 

Он всегда возвращает все элементы, пренебрегает itemDescription LIKE ... Я проверил базу данных и все присоединиться к идентификаторам отлично

Это работает:

query = "SELECT user" 
      + " FROM Users user " 
      + " INNER JOIN user.participant part " 
      + " INNER JOIN part.addresses addr " 
      + " WHERE user.userType LIKE '%borrow%') AND addr.addressType = 'primary'"; 

У меня есть таблица пользователей , Он имеет связь «один-ко-многим» с табличным участником.

В Users.java у меня есть ..

private Set<Participant> participant = new HashSet<Participant>(); 

с

@OneToMany 
    @JoinTable(name = "echomarket.hibernate.Participant") 
    @JoinColumn(name = "user_id") 
    public Set<Participant> getParticipant() { 
    return participant; 
    } 

    public void setParticipant(Set<Participant> participant) { 
    this.participant = participant; 
    } 

Это присоединиться отлично работает.

В Participant.java У меня есть

private Set<Addresses> addresses = new HashSet<Addresses>(); 

с

@OneToMany 
    @JoinTable(name = "echomarket.hibernate.Addresses") 
    @JoinColumn(name = "participant_id") 
    public Set<Addresses> getAddresses() { 
    return addresses; 
    } 

    public void setAddresses(Set<Addresses> addresses) { 
    this.addresses = addresses; 
    } 

И частный Устанавливаемая = новый HashSet();

С

@OneToMany 
    @JoinTable(name = "echomarket.hibernate.Items") 
    @JoinColumn(name = "participant_id") 
    public Set<Items> getItem() { 
    return item; 
} 

Нет ассоциации заявление в отношении пользователей.

В Addresses.java не создаю ассоциаций.

В Items.java У меня есть

private Set<ItemImages> itemImages = new HashSet<ItemImages>(); 

с

@OneToMany 
    @JoinTable(name = "echomarket.hibernate.ItemImages") 
    @JoinColumn(name = "itemId") 
    public Set<ItemImages> getItemImages() { 
    return itemImages; 
    } 

public void setItemImages(Set<ItemImages> itemImages) { 
    this.itemImages = itemImages; 
    } 

В ItemImages.java я не делаю никаких ассоциаций ...

Очень спасибо за вашу помощь. Если вам нужна дополнительная информация, пожалуйста, просто спросить ...

Лиз

+0

Кстати, только что попробовали GROUP BY на все поля, извлекаемых, по-прежнему возвращают слишком много записей. – emm

+0

как вы используете свой запрос? – degr

+0

В managedBean. – emm

ответ

0

Не удалось получить выше INNER JOIN запросов к work-- предназначен для поиска, который включает в себя множество таблиц. Я тестировал каждый JOIN самостоятельно успешно, но вместе JOIN не работает. Также возникли проблемы с поиском запроса LIKE. Я очень много работал, чтобы найти решения. Поэтому я переписал следующее: сбор данных разделен на два запроса. Следующие работы:

SearchResults общественного струнный() {

Session sb = null; 
Transaction tx = null; 
String queryString = ""; 
String forceString = this.found_zip_codes; 
List results = null; 
String fromStatement = ""; 
if (this.lenderOrBorrower == 2) { 
    this.which = "borrow"; 
} else { 
    this.which = "lend"; 
} 
this.imageLibrary = this.which + "_images"; 

fromStatement = " SELECT part " 
     + " FROM Participant part " 
     + " INNER JOIN part.addresses addr " 
     + " WHERE addr.addressType = 'primary' "; 

if (ubean.getComDetailID() != null) { 
    fromStatement = fromStatement + " AND part.communityId = \'" + ubean.getComDetailID() + "\' "; 
} else { 
    fromStatement = fromStatement + " AND part.communityId = ''"; 
} 

if (this.postalCode.isEmpty() == false) { 
    fromStatement = fromStatement + " OR addr.postalCode LIKE \'" + this.postalCode + "%\'"; 
} 

try { 
    sb = hib_session(); 
    tx = sb.beginTransaction(); 
    results = sb.createQuery(fromStatement).list(); 
    tx.commit(); 
} catch (Exception ex) { 
    tx.rollback(); 
    Logger.getLogger(SearchesBean.class.getName()).log(Level.SEVERE, null, ex); 
} finally { 
    tx = null; 
    sb = null; 
} 

String[] pids = new String[results.size()]; 
String hold_pid = ""; 
if (results != null) { 
    if (results.size() > 0) { 
    for (int i = 0; i < results.size(); i++) { 
     Participant cArray = (Participant) results.get(i); 
     if (cArray.getParticipant_id().isEmpty() == false) { 
     hold_pid = "\'" + cArray.getParticipant_id() + "\'"; 
     pids[i] = hold_pid; 
     } 
    } 
    hold_pid = String.join(",", pids); 
    } 
} 

results = null; 
fromStatement = " FROM Items itm WHERE itm.itemType = :which " 
     + (hold_pid.isEmpty() ? "" : " AND itm.participant_id IN (" + hold_pid + ")"); 


if ((this.startDate.isEmpty() == false) && (this.endDate.isEmpty() == false)) { 
    try { 
     queryString = queryString + " OR "; 
     queryString = queryString + " (itm.dateCreated >= \'" + this.startDate + "\' AND itm.dateCreated <= \'" + this.endDate + "\') "; 

    } catch (Exception ex) { 
    Logger.getLogger(SearchesBean.class.getName()).log(Level.INFO, null, ex); 
    } 
} 
forceString = this.keyword; 
if (forceString.isEmpty() == false) { 
    queryString = queryString + " OR "; 
    queryString = queryString + " (itm.itemDescription like \'%" + forceString + "%\' OR itm.itemModel like \'%" + forceString + "%\')"; 
} 

if ((this.categoryId != -2)) { 
    queryString = queryString + " OR"; 
    queryString = queryString + " itm.categoryId = " + this.categoryId; 
} 

fromStatement = fromStatement + queryString; 

try { 
    sb = hib_session(); 
    tx = sb.beginTransaction(); 
    results = sb.createQuery(fromStatement).setParameter("which", this.which).list(); 
    tx.commit(); 
} catch (Exception ex) { 
    tx.rollback(); 
    Logger.getLogger(SearchesBean.class.getName()).log(Level.SEVERE, null, ex); 
} finally { 
    tx = null; 
    sb = null; 
} 

this.itemDetail = results; 

return "search"; 

}