JPQL从多个表中选择

时间:2013-11-19 05:09:04

标签: select jpa jpql

我是JPQL的新手,对我认为可能是一个非常简单的查询有些麻烦。如果有可能,请有人解释。

我有两个无关表:'客户'和'商家'。它们都包含一个名为“用户名”的字段。是否有一个查询会返回一个“用户名”记录,该记录显示在任一表中并且与我提供的值匹配?

Query query = entityManager.createQuery("select c from Customers c where c.username = :username");                 
query.setParameter("username", username_);

这样的东西,但对于两个表。

2 个答案:

答案 0 :(得分:0)

如果这确实不起作用:(我认为确实如此,至少在CriteriaQuery中我确信它确实如此) 查询查询= entityManager.createQuery(“从客户c中选择c,商家m,其中c.username =:username 和m.username = c.username“);
query.setParameter(“username”,username _);

您可以随时执行此操作: 查询查询= entityManager.createQuery(“从客户c中选择c,其中c.username =:username 和c.username in(从商家m中选择m.username)“);
query.setParameter(“username”,username _);

答案 1 :(得分:0)

听起来您希望将给定的用户名与CustomerMerchant匹配。由于这两个表是无关的,所以使用单个查询来执行此操作,我相信您需要形成一个cartesian product(将一个表的每一行与另一个表中的每一行连接起来)。正如您可能想象的那样,这可能效率很低。你最好做两个简单的查询:

try {
  Customer c = em.createQuery("SELECT c FROM Customer c WHERE c.username = :username", Customer.class)
                 .setParameter("username", username)
                 .getSingleResult();

  // ... do something with the customer ...
} catch (NoResultException e) {
  // user wasn't found in the customer table, try merchant:
  try {
    Merchant m = em.createQuery("SELECT m FROM Merchant m WHERE m.username = :username", Merchant.class)
                   .setParameter("username", username)
                   .getSingleResult();

    // ... do something with the merchant ...
  } catch (NoResultException e) {
    // user wasn't found in either table
  }
}

注意:我假设usernameCustomerMerchant是唯一的。

请注意,如果我们找不到具有第一个查询的用户,则此方法将仅执行第二个查询。如果您不需要返回对象(即只需要检查它是否存在),那么您可以使用两个计数查询来简化上述操作。计数查询总是返回结果,因此您不需要捕获NoResultException s