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

基于实体列表属性的过滤JPA查询

颛孙天宇
2023-03-14

我有一个使用Postgre 9.3和JPA2.1(Hibernate实现)的Spring MVC应用程序。我有一个类'电影',其中有一组评论。我想写一个JPA NamedQuery,它返回我所有的电影细节,但只有批准的评论。评论可以有其他状态,但我想只显示批准的评论。

我的班级如下所示:

@NamedQueries({
@NamedQuery(name="Movie.findMovieById",
    query="SELECT c FROM Movie c WHERE c.id = :MovieId"),
@NamedQuery(name="Movie.findMovieByIdAndApprovedReviews",
    query="SELECT c FROM Movie c INNER JOIN c.reviews r WHERE c.id = :MovieId AND r.state = 'USER_REVIEW_APPROVED'"),
})
public class Movie implements Serializable {

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

    //Movie Name
    @Column(name = "name")
    private String name;

    //One Movie can have many reviews hence OneToMany
    @OneToMany(fetch=FetchType.EAGER, mappedBy="Movie")
    private Set<UserReview> reviews;

    .
    .
    .

}

我写的查询不会过滤评论并返回包含所有评论的电影;它的工作原理与上面显示的findMovieById查询相同。

是否可以编写这样的查询?或者我必须把一些其他黑客过滤批准的评论?

谢谢。

共有1个答案

公冶同
2023-03-14

你可以尝试使用Hibernate过滤器

@FilterDef(name="onlyApproved")
public class Movie implements Serializable {

...

@Filter(name="onlyApproved", condition="state = 'USER_REVIEW_APPROVED'")
@OneToMany(fetch=FetchType.EAGER, mappedBy="Movie")
private Set<UserReview> reviews;

然后,在执行查询时只需激活过滤器

Session session = entityManager.unwrap(Session.class);
session.enableFilter("onlyApproved");
entityManager.createNamedQuery(...);
 类似资料:
  • 在这种情况下,我需要根据项的某些属性(即条件是内部的而不是外部的)筛选。我发现javafx有,所以我尝试了一下。我可以设置谓词和筛选工作,直到确定筛选的属性值发生变化。现在可以像下面这样设置谓词: 由于谓词返回boolean而不是BooleanProperty,因此对该属性的更改不会反映在列表中。 对此有什么简单的解决办法吗?我可以尝试做一些变通方法,例如创建一个单独的列表并同步它,或者每次属性在

  • 使用Jackson过滤掉属性非常简单: 我正在尝试将其集成到我的Jersey REST应用程序中。API用户可以通过提供查询字符串来过滤属性: 在泽西岛最优雅的方式是什么?我可以很容易地在我的资源方法中执行上述操作,但这不知何故破坏了Jersey的优雅。此外,我认为为每个请求创建一个新的ObjectMapper会导致性能下降。 我可以编写一个MessageBodyWriter,它从UriInfo上

  • 基于 那个东西的 以下是我目前所尝试的: 我想使用一个Java8流和两个getter的lambdas来完成这一操作,这两个getter最终检索用于确定唯一性的属性,但不确定如何实现。当用于比较的属性位于pojo的顶层时,我知道如何做,但当属性嵌套在另一个对象中时,我不知道如何做。

  • 问题内容: 我有一个简单的jpa实体“ ApplicationForm”,其中有一对多列表: ApplicationForm中包含的变量Dictionary是仅带有问题文本的另一个普通实体。字典映射的相应数据库表为: 我想知道是否可以使用jpa或hibernate建立一个查询,以使用特定语言环境(例如“ it”)的Dictionary检索ApplicationForm实体。使用标准sql可以轻松完

  • 问题内容: 我有一个简单的jpa实体“ ApplicationForm”,其中有一对多列表: ApplicationForm中包含的变量Dictionary是仅带有问题文本的另一个普通实体。字典映射的相应数据库表为: 我想知道是否可以使用jpa或hibernate建立一个查询,以使用特定语言环境(例如“ it”)的Dictionary检索ApplicationForm实体。使用标准sql可以很容易

  • 我有一个类似这样的组对象 和如下所示的Item对象