【问题标题】:How to make a JPA query use primitive ID instead of managed instance?如何使 JPA 查询使用原始 ID 而不是托管实例?
【发布时间】:2022-01-17 03:37:37
【问题描述】:

我试过了,但找不到更好的标题,所以看起来很奇怪,但问题实际上很简单......

我有一个使用外来键的 JPA 查询,默认情况下 JPA 将托管实体作为外来键来执行查询,有什么方法可以通过长 id 来代替吗?

示例:

@Entity
@Table(name = "user")
public class User   {

    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER, orphanRemoval = true, mappedBy = "user")
    private Set<Item> entries = new HashSet<>();
    
}
@Entity
@Table(name = "item") 
public class Item implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
 
    @ManyToOne(targetEntity = User.class, optional = false, fetch = FetchType.LAZY)
    private User user;
    
}
@Repository
public interface ItemRepository extends PagingAndSortingRepository<User, Long> {
    
        // @formatter:off
        @Query("SELECT item FROM Item item WHERE (:user is null OR :user = item.user)")
        Page<Item> findByUser(@Param("user")User user, Pageable pageable);
        //@formatter:on
    
    }

我想要的不是将用户实体传递给存储库类,而是只传递它的 id,这样我可以将 id 作为参数并避免在数据库上再查询一次以从其 id 中检索用户

我该怎么做

【问题讨论】:

  • 要么以这种方式编写查询,要么使用getById 来“获取”用户(它实际上只会使用主键创建一个代理),然后您可以在查询中使用该用户。因此它不会对User 实体发出额外的查询。

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


【解决方案1】:

好吧,只需将参数设置为Long,然后

@Query("SELECT item FROM Item item WHERE (:userId is null OR :userId = item.user.id)")
Page<Item> findByUser(@Param("userId")Long userId, Pageable pageable);

【讨论】:

    猜你喜欢
    • 2012-07-02
    • 2012-05-25
    • 2018-11-13
    • 1970-01-01
    • 2016-02-02
    • 1970-01-01
    • 2021-10-23
    • 2016-08-27
    • 2016-08-19
    相关资源
    最近更新 更多