繁体   English   中英

为什么 JPQL 忽略父字段?

[英]Why JPQL ignore parent's fields?

应用程序堆栈: HibernateSpring DataJPA

应用程序中有一些实体。 我尝试在我的 class OpenParagraph的存储库中进行 JPQL 查询。

打开段落

@Entity
@Table(name = "open_paragraphs")
@NoArgsConstructor
@AllArgsConstructor
@Getter
@Setter
@ToString
public class OpenParagraph extends ProgramEntry {

    @NotNull
    @Column(name = "sort_num")
    private Integer sortNum;
}

OpenParagraph有一个父级: abstract class ProgramEntry

节目入口

@MappedSuperclass
@NoArgsConstructor
@AllArgsConstructor
@Getter
@Setter
@ToString
public abstract class ProgramEntry extends AbstractBaseEntity {

    @NotNull
    @ManyToOne
    @JoinColumn(name = "paragraph_id")
    private Paragraph paragraph;

    @NotNull
    @ManyToOne
    @JoinColumn(name = "program_id")
    private Program program;
}

所以,我试图诉诸OpenParagraph的“段落”字段,但 IDEA 告诉我这是错误的:

在此处输入图像描述

它没有为我提供“程序”字段:

在此处输入图像描述

IDEA 仅提供来自OpenParagraph的字段,而不来自父级。

我的问题:这是IDEA的失败吗? 如果这不是 IDEA 的失败,那么我如何在这个查询中调用“程序”?

这是/曾经是 Intellij IDEA 的错误(可能与有关?)。 但:

可以通过超级 class (或MappedSuperclass )的字段进行查询。 这是一个例子:

@MappedSuperclass
@Getter
@Setter
public class Foo extends AbstractPersistable<Long> {

    @Column
    private String fooValue;
    
}

@Entity
@Getter
@Setter
public class Bar extends Foo {

    @Column
    private String barValue;
    
}

public interface BarRepository extends JpaRepository<Bar, Long> {

    @Query("SELECT b FROM Bar b WHERE b.fooValue = ?1")
    List<Bar> findByFooValue(String fooValue);
    
}

鉴于此,调用存储库方法,将记录如下内容(启用 sql 日志记录):

Hibernate: select bar0_.id as id1_0_, bar0_.foo_value as foo_valu2_0_, bar0_.bar_value as bar_valu3_0_ from bar bar0_ where bar0_.foo_value=?

暗示:

如果您使用的是 Spring 引导(带有测试依赖项/依赖项和像 h2 这样的嵌入式测试数据库),则无需运行整个应用程序即可很容易地执行此类方法。 这里只是一个执行该方法的小片段(尽管这不是测试,但这足以以某种方式调用方法):

@SpringBootTest
public class BarRepositoryTest {

    @Autowired
    BarRepository barRepository;
    
    @Test
    public void testFindByFooValue() {
        barRepository.findByFooValue("foo");
    }
    
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM