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

带过滤器的JPQL-Join查询

宰子琪
2023-03-14

我有证据:

@Entity
@Getter
@Setter
@NoArgsConstructor
public class Technic implements Serializable {

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

    private String name;

    private String gosNumber;

    private String invNumber;

    private String shassisNumber;

    private String engineNumber;

    @Column(length = 100)
    private String yearOfMake;

    @ManyToOne
    private Farm farm;

    @JsonManagedReference
    @ManyToOne
    private TechGroup techGroup;

    @JsonManagedReference
    @ManyToOne
    private TechType techType;

    @JsonManagedReference
    @ManyToOne
    private TechMark techMark;

    @JsonIgnore
    @CreationTimestamp
    @Column(name = "creation_date", updatable = false)
    private LocalDateTime createdDate;

    @JsonIgnore
    @Column(name = "updated_date")
    @UpdateTimestamp
    private LocalDateTime updatedDate;

    @JsonIgnore
    @Column(columnDefinition = "Bool default false")
    private Boolean isDel;


    @JsonManagedReference
    @OneToMany(mappedBy = "technic")
    private List<TechnicStatus> technicStatusList = new ArrayList<>();

    public List<TechnicStatus> getTechnicStatusList() {
        return technicStatusList;
    }

    public void setTechnicStatus(TechnicStatus technicStatus) {
        this.technicStatusList = new ArrayList<>();
        this.technicStatusList.add(technicStatus);
    }
@Entity
@Getter
@Setter
@NoArgsConstructor
public class TechnicStatus implements Serializable  {



    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "technic_status_id")
    private Long id;

    @JsonBackReference
    @ManyToOne
    private Technic technic;

    @JsonManagedReference
    @ManyToOne
    private Status status;

    private Boolean isGarantia;

    private Boolean isLizing;

    private LocalDate visitedDate;

    private LocalDate notWorkDate;

    private String description;

    @JsonIgnore
    private boolean isActive;

    @JsonIgnore
    @CreationTimestamp
    @Column(name = "creation_date", updatable = false)
    private LocalDateTime createdDate;
}

我想从我的数据库中获得结果,它包含每个对象中的列表technicStatusList=new arraylist<>(),我想在其中有一个TechnicStatus仅值为isactive=true。

为此,我使用了相同的JPQL查询:

TypedQuery<Technic> query = em.createQuery("Select t  from Technic t join TechnicStatus ts on t.id = ts.technic.id where t.isDel=false and ts.isActive=true and t.farm.id=:farmId order by t.techGroup.name, t.techType.name, t.techMark.name", Technic.class);

但是得到一个包含TechnicStatus的结果,该结果返回一个包含true和false的TechnicStatus.isactive=true,TechnicStatus.isactive=false)。

我希望以本机查询的形式获得结果:

SELECT 
    *
FROM
    technic
        JOIN
    technic_status ON technic.id = technic_status.technic_id
WHERE
    technic.is_del = FALSE
        AND technic_status.is_active = TRUE
        AND technic.farm_id = 1722

共有1个答案

林夕
2023-03-14

与技术相关联的TechnicalStatus列表将始终是由映射定义的完整列表。

基本上你有两个选择。如果您只对状态为Active的TechnicalStatus感兴趣,那么可以在关联中使用非可移植的、特定于Hibernate的@where子句。

@JsonManagedReference
@OneToMany(mappedBy = "technic")
@Where("active = 1")
private List<TechnicStatus> technicStatusList = new ArrayList<>();

https://dzone.com/articles/hibernate-where-子句

否则,您所做的就是从查询方法返回一个TechnicalStatus列表,这不是您想要的,而是您所拥有的全部。

 类似资料:
  • 不带筛选器的查询: 当我用curl:curl-w'\ntime_total:%{time_total}\n'-h'content-type:application/json'-xget-d‘{}':9200/store/msg/_search?routing=user1来度量这两个查询的性能时 不带筛选器的查询得到的总时间:1.134、1.237、1.107,带筛选器的查询时间:1.322、1.4

  • 问题内容: 对于 内部联接 ,在子句或子句中应用过滤器的性能有何不同?哪个会更有效,或者优化器将使它们相等? 加入 VS 在哪里 Oracle11gR2 问题答案: 应该没有区别。在这两种情况下,优化器都应生成相同的计划,并且应该能够基于特定查询的最有效方法,在这两种情况下的连接之前,之后或之中应用谓词。 当然,事实优化 可以 做一些事情,一般来说,是不能保证优化器 会 做一些实际的特定查询。随着

  • 我试图编写一个由2个部分组成的弹性搜索布尔查询。我想要“必须”的两个条件和“应该”的两个条件。问题是我只想得到“应该”的分数。我尝试了“过滤器”,但没有成功。 你有什么想法吗?

  • 问题内容: 我正在尝试使用过滤查询集 我的问题是我不知道用户想提前搜索哪个字段,因此我需要用一个变量替换“名称”,如下所示 我怎么做? 问题答案: 差不多了.. 要了解它在做什么,请在Google周围搜索 :)了解Python中的kwargs 将字典键/值对扩展为关键字参数-值对。 使你的示例适应解决方案:

  • 问题内容: “过滤后的查询和过滤器”与“根查询和过滤器”之间有什么区别吗?例如 情况1: 情况2: 我在http://elasticsearch-users.115913.n3.nabble.com/Filtered-query-vs-using- filter-outside-td3960119.html中 找到了此讨论,但所引用的URL是404,并且解释过于简洁我。 请示教或提供指出这些区别的

  • null 当我提供nothing查询时,返回所有父亲 当我提供父亲名“乔恩”时,我希望是乔恩·雪诺和乔恩·阿尔比 当我提供姓氏“Colby”时,查询将返回HARRY Colby 我尝试了数百万次,但我不能写一个查询,当我没有提供任何参数时,它将返回所有父,当我提供一些参数时,它将减少找到的父列表。