【问题标题】:Spring Boot JPA - find by 2 columnsSpring Boot JPA - 按 2 列查找
【发布时间】:2020-12-16 18:20:50
【问题描述】:

我不知道如何创建 JPA 查询以从我的表中获取所有记录:

@Entity
@Table(name = "A")
public class A{

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(nullable = false, updatable = false)
    private Long id;

    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "message_id")
    private Message;

    @OneToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "user_id")
    private User user;
}
@Entity
@Table(name="message")
@Getter
@Setter
public class Message{

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(nullable = false, updatable = false)
    private Long id;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "account_id", foreignKey = @ForeignKey(name = "FK_account_to_message"))
    private Account account; //and then search by Account.id
}

所以我在 A 表中有 2 种类型的对象(有时对象是从电子邮件创建的,有时是从文件创建的):

  1. 一种没有user_id(null)的类型->然后我必须通过Message -> Account -> Id搜索找到所有A对象
  2. 第二类user_id -> 我们可以通过user_id列中的值直接获取A对象

我想获取特定user_id 的所有记录 -> 如何以最有效的方式做到这一点?我不想在存储库中调用 2 个方法:

 User user = userService.getEmail();
        List<A> aObjects= Stream.concat(ARepository.findByMessage_Account_Id(user.getId()).orElse(new ArrayList<>()).stream(),
                aRepository.findByUser_Id(user.getId()).orElse(new ArrayList<>()).stream()).collect(Collectors.toList());

是否可以创建一个存储库方法来查找 2 个不同对象的所有记录(一个带有 user_id,第二个不带有 user_id)?

【问题讨论】:

    标签: spring-boot hibernate spring-data-jpa


    【解决方案1】:

    我猜这个查询对于使用从方法名查询派生的查询来说太复杂了。正如documentation 中所述:

    虽然从方法名派生查询非常方便,但可能会遇到方法名解析器不支持要使用的关键字或方法名变得不必要的丑陋的情况时间>。因此,您可以通过命名约定使用 JPA 命名查询,也可以使用 @Query 注释您的查询方法。

    所以,我建议只写以下查询:

    @Query("select aa from A aa left join aa.user u left join aa.message msg left join msg.account acc where (u is null and acc is not null and acc.id = :userId) or (u is not null and u.id = :userId)")
    List<A> findByUserOrAccountId(@Param("userId") Long userId);
    

    【讨论】:

    • 不幸的是,我仍然得到满足第一个要求的值:where (aa.user is null and aa.message.account.id = :accountId)。并且 userId 和 accountId 一样
    • 是的,现在它可以工作了:) 谢谢:) 这并不容易......
    猜你喜欢
    • 2020-01-25
    • 2018-11-07
    • 2021-10-13
    • 1970-01-01
    • 2021-08-01
    • 2023-03-10
    • 2021-09-15
    • 2022-01-24
    • 1970-01-01
    相关资源
    最近更新 更多