2016-12-28 41 views
0

为什么没有此查询工作?Hibernate的连接查询不工作:Java/JSP的与Hibernate,Netbeans的IDE/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喜欢...我检查了数据库和所有加入的ID都很好

这工作:

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; 
} 

没有关于用户协会声明。

In 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

无法获取查询work--用于涉及许多表搜索上面的INNER JOIN。我成功地测试了每个JOIN,但一起JOIN不起作用。查询识别LIKE语句也有问题。我非常努力地寻找解决方案。所以我重写了以下内容,数据收集分为两个查询调用。以下作品:

公共字符串SearchResult所(){

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"; 

}