【问题标题】:Hibernate JOIN query not working: Java/JSP with Hibernate, IDE Netbeans/GlassFish, Windows 10Hibernate JOIN 查询不起作用:Java/JSP with Hibernate、IDE Netbeans/GlassFish、Windows 10
【发布时间】:2016-12-28 13:01:58
【问题描述】:

为什么这个查询不起作用?

  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...我检查了数据库,所有的连接 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'";

我有一个表用户。它与表 Participant 是一对多的关联。

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

并且 私有 Set item = new 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 中我没有关联...

非常感谢您的帮助。如果您需要更多信息,请询问...

丽兹

【问题讨论】:

  • 顺便说一下,刚刚在所有检索到的字段上尝试了 GROUP BY,仍然返回太多记录。
  • 你如何使用你的查询?
  • 在 managedBean 中。

标签: java hibernate inner-join jointable


【解决方案1】:

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

公共字符串搜索结果(){

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

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-10-19
    • 2018-12-04
    • 1970-01-01
    • 2017-07-11
    • 1970-01-01
    • 1970-01-01
    • 2011-08-14
    • 1970-01-01
    相关资源
    最近更新 更多