Spring boot Spring Boot JPA-按2列查找
我不知道如何创建JPA查询以从我的表中获取所有记录:Spring boot Spring Boot JPA-按2列查找,spring-boot,hibernate,spring-data-jpa,Spring Boot,Hibernate,Spring Data Jpa,我不知道如何创建JPA查询以从我的表中获取所有记录: @Entity @Table(name = "A") public class A{ @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(nullable = false, updatable = false) private Long id; @ManyToOne(fetch = FetchType.E
@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;
}
所以我在一个表中有两种类型的对象(有时对象是从电子邮件创建的,有时是从文件创建的):
user\u id
(null)->然后我必须通过Message->Account->id
搜索所有A
对象user\u id
->我们可以通过user\u id
列中的值直接获得A
对象用户id
->的所有记录如何以最有效的方式进行?我不想调用存储库中的两个方法:
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());
User=userService.getEmail();
List aoobjects=Stream.concat(一个pository.findByMessage_Account_Id(user.getId()).orElse(new ArrayList()).Stream(),
aRepository.findByUser_Id(user.getId()).orElse(newarraylist()).stream()).collect(Collectors.toList());
是否可以创建一个存储库方法来查找两个不同对象的所有记录(一个具有
user\u id
,另一个不具有user\u id
)?我想这个查询对于使用从方法名称查询派生的查询来说太复杂了。正如报告中所述:
虽然从方法名派生的查询非常方便,但是可能会遇到这样的情况:要么方法名解析器不支持想要使用的关键字,要么方法名变得不必要的丑陋。因此,您可以通过命名约定使用JPA命名查询,也可以使用@query
注释查询方法
因此,我建议只编写以下查询:
@Query(“从aa left join aa.user u left join aa.message msg left join msg.account acc中选择aa,其中(u为null,acc为非null,acc.id=:userId)或(u为非null,u.id=:userId)”)
列出findByUserOrAccountId(@Param(“userId”)Long userId);
不幸的是,我仍然得到满足第一个要求的值:where(aa.user为null,aa.message.account.id=:accountId)。userId与accountid相同尝试使用更新的queryeahh现在它可以工作了:)谢谢:)这不是那么容易。。。
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());