当前位置: 首页 > 知识库问答 >
问题:

Spring数据JPA/SQL:过滤连接表并显示主表,即使连接不成功

尉迟景福
2023-03-14

我有两张桌子:

 -------         ----------
|  User |       |   Order  |
|-------|       |----------|
|  id   |       |    id    |
|-------|       |----------|
|  name |       |  user_id |
 -------        |----------| 
                |start_time|
                 ----------

比如说,我有记录:

User {id: 1, name: "Sam"};
User {id: 2, name: "Andrew"};

Order {id:1, user_id: 1, start_time: '2020-00-00 00:00:00'}
Order {id:2, user_id: 1, start_time: '2021-00-00 00:00:00'}
Order {id:3, user_id: 1, start_time: '2022-00-00 00:00:00'}

我如何运行posgre sql select,以在任何情况下获取用户,即使订单不存在?喜欢:

SELECT u.*, o.start_time FROM User u
INNER JOIN Order o on o.user_id = u.id AND o.start_time = '2030-00-00 00:00:00'

where u.name = 'Sam'

所以,基本上,我想在任何情况下获得用户。并过滤孩子(加入表)

在Spring Data Jpa术语中,我希望在任何情况下都能接收到用户,如果用户存在于数据库中,我希望通过我的sql查询过滤他/她的订单。

如果我尝试使用不存在的过滤订单获取用户,我不会从我的查询中接收用户

Java代码,域对象:

//Entity, Geter, Setter, equalsAndHashCode
class User {

  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  private Long id;

  @Unique
  private String name;

  @OneToMany(mappedBy = "user", cascade = CascadeType.ALL, orphanRemoval = true)
  private List<Orders> orders;
}

class Order {

  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  private Long id;

  @ManyToOne
  @JoinColumn(name = "user_id", referencedColumnName = "id", nullable = false)
  private User user;

  private OffsetDateTime startTime;
}

存储库:

public interface UserRepository extends JpaRepository<User, Long> {
    

  @Query(to be done)
  Optional<User> findByUserNameWithFilteredOrders(@Param("userName") String userName,
                                                 @Param("startTime") OffsetDateTime startTime);
  
}

JTYF:我只对自定义查询感兴趣,做findBy。。。生成查询对我来说并不有趣,因为我有更复杂的情况。

共有1个答案

越国源
2023-03-14

似乎本机查询应该是左连接,而不是内部连接。

SELECT u.*, 
       o.start_time 
FROM User u
LEFT JOIN Order o ON o.user_id = u.id 
WHERE (o.start_time = '2030-00-00 00:00:00' or o.user_id = NULL)

这将为您提供所有用户,无论他们是否参与关系顺序。

 类似资料:
  • 得到一些问题与桌子布线。我需要为每个用户uniq购物车,在那里我将存储书籍。 当我在DB中打开AppUser表时,“cart_id”列始终为NULL。 购物车表只有id列-不确定是否应该这样 谢谢! 购物车

  • 问题内容: 我有一个查询表,说具有字段CityId,CityName的城市 我有一个订单表,其中包含以下字段:CityId,CustId,CompletedOrders,PendingOrders 我想要一个表/报告,列出所有城市中给定客户的订单详细信息,即我需要的结果是: 怎么做 ? 问题答案: 这将返回所需的所有行,但是对于其中不存在的行将返回值,因此您将获得: 取而代之的解决方案取决于您的数

  • T-SQL 组合来自两个或多个表的记录。它用于将两个或多个表中的记录连接到数据库中。JOIN 用于通过使用彼此相等的值连接许多表中的字段。 假设有下面两张表,(a) CUSTOMERS表,记录如下—— (b) 另一个表 ORDERS,记录如下 - 在 SELECT 语句中连接这两个表,如下所示 - 执行上面查询语句,得到以下结果 - 连接在 WHERE 子句中执行。许多运算符将用于连接表,例如:

  • 在关系数据库管理系统中,表建立时各数据之间的关系不必确定,常把一个实体的所有信息存放在一个表中。当检索数据时,通过连接操作查询出存放在多个表中的不同实体的信息。连接操作给用户带来很大的灵活性,它们可以在任何时候增加新的数据类型。为不同实体创建新的表,之后通过连接进行查询。 连接可以在语句的子句或子句中建立,似是而非在FROM子句中指出连接时有助于将连接操作与WHERE子句中的搜索条件区分开来。所以

  • 我想使用Spring JPA规范连接函数 这是我的表格代码: > } 我如何在规范中加入表中的学生和家长?

  • 我需要在火花中连接2个表。但是我首先过滤掉第二个表的一部分,而不是完全连接2个表: 我想在这种情况下使用广播连接。 Spark有一个参数,用于定义广播连接的最大表大小:: 配置在执行联接时将广播到所有工作节点的表的最大大小(以字节为单位)。通过将该值设置为-1,可以禁用广播。请注意,当前统计信息仅支持已运行命令ANALYZE TABLE COMPUTE statistics noscan的配置单元