我正在尝试编写一个查询,其中将应用两个微服务应用程序数据库中的条件来检索数据。是否可以在存储库中编写@Query
来这样做,还是我需要通过服务或任何其他方法来编写它?使用下面的当前功能,我得到一个错误。任何代码示例或参考文章都将不胜感激。
下面,我展示了我的控制器功能和存储库查询。
控制器功能:
@GetMapping("/orders/query/test/")
public List<Orders> findAllOrdersWhereCondition(){
log.info("Start of findAllOrdersWhereCondition method");
return repository.findAllActiveAndUnrespondedQueriesForHelp();
}
存储库功能:
@Query("SELECT g FROM ORDERS g INNER JOIN operators o ON g.profileToId = o.id OR g.profileFromId = o.id WHERE g.active = true and g.responded = false AND o.operatorType = 1 ")
List<Orders> findAllActiveAndUnrespondedQueriesForHelp();
答案 0 :(得分:0)
是一个服务在与两个数据库通信,还是两个服务在与各自的数据库通信?
如果是前者,并且数据库是关系数据库和ACID,则可以执行JOIN和单个查询。
如果是后者,则必须发出两个HTTP请求,每个服务一个。他们彼此不认识。在这种情况下,您可能已经放弃了ACID。
答案 1 :(得分:-1)
如果没有错误消息和应用程序的实体类,很难给出正确的答案。但是我认为,您在查询中的表名称中犯了一个错误-如果您使用JPQL,则需要观察编写查询的实体类名称的寄存器。在您的情况下,可能是:
@Query("SELECT g FROM Orders g INNER JOIN Operators o ON g.profileToId = o.id OR g.profileFromId = o.id WHERE g.active = true and g.responded = false AND o.operatorType = 1 ")
List<Orders> findAllActiveAndUnrespondedQueriesForHelp();
如果要使用纯SQL查询数据库,则需要将nativeQuery
字段设置为true。例如:
@Query("SELECT g FROM Orders g INNER JOIN Operators o ON g.profileToId = o.id OR g.profileFromId = o.id WHERE g.active = true and g.responded = false AND o.operatorType = 1 ", nativeQuery = true)
List<Orders> findAllActiveAndUnrespondedQueriesForHelp();