Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Select JPQL从多个表中选择_Select_Jpa_Jpql - Fatal编程技术网

Select JPQL从多个表中选择

Select JPQL从多个表中选择,select,jpa,jpql,Select,Jpa,Jpql,我是JPQL新手,在我认为可能是一个非常简单的查询方面遇到了一些问题。请有人解释一下是否可能 我有两个不相关的表格:“客户”和“商家”。它们都包含一个名为“username”的字段。是否有一个查询会返回一个出现在任一表中且与我提供的值匹配的“username”记录 Query query = entityManager.createQuery("select c from Customers c where c.username = :username"); q

我是JPQL新手,在我认为可能是一个非常简单的查询方面遇到了一些问题。请有人解释一下是否可能

我有两个不相关的表格:“客户”和“商家”。它们都包含一个名为“username”的字段。是否有一个查询会返回一个出现在任一表中且与我提供的值匹配的“username”记录

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

类似这样的东西,但两张桌子都有

如果这真的不起作用:我认为它起作用了,至少对于CriteriaQuery,我确信它起作用了 Query Query=entityManager.createquery从客户c中选择c,其中c.username=:username m.username=c.username; query.setParameterusername,username

您始终可以这样做: Query Query=entityManager.createQueryselect c from Customers c其中c.username=:username 和c.username 在中选择m.username from Merchants m;
query.setParameterusername,username

听起来您想要将给定用户名与客户或商户匹配。由于这两个表是不相关的,要通过单个查询实现这一点,我相信您需要将一个表中的每一行与另一个表中的每一行连接起来。正如你所想象的,这可能是非常低效的。您最好执行两个简单的查询:

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
  }
}
注意:我假设用户名在Customer和Merchant中是唯一的


请注意,如果找不到第一个查询的用户,这种方法将只执行第二个查询。如果您不需要返回对象,即只需要检查对象是否存在,则可以使用两个计数查询简化上述操作。Count查询总是返回一个结果,因此您无需捕获NoResultExceptions

可能重复的感谢回答和对我延迟响应的道歉。我可以从你的解决方案中看出,我没有很好地解释我的问题,所以我要再试一次。我想检查我的输入是否与客户或商户匹配,即如果客户表中有一条记录具有正确的用户名,则返回该记录。如果没有,则检查merchant表,如果没有匹配,则不返回任何内容。我希望这更清楚。我只想补充一点,如果是我,遇到这样的情况会发出危险信号,也许我应该重新考虑设计。例如,为什么Customer和Merchant不同时扩展一个公共用户类?如果他们这样做了,您可以简单地查询用户。谢谢您的回答。实际上,我有一个非常类似的解决方案,我只是想知道在JPQL中是否有一种更简洁的方法。关于扩展一个公共类,我对如何减少所需的JPQL代码量感到困惑。你是说我可以将所有的用户表映射到一个用户类,然后运行这样的操作:select u from user where u.username=:username?@Caiman是的,假设Customer和Merchant是用户,你可以将诸如username之类的公共内容移动到用户超类。您仍将拥有包含其任何特定属性的Customer和Merchant。我没有完整的图片,所以它可能不是一个好的改变…这只是一个想法。有关更多信息,请查看。