
[英]JPQL query: selecting a single Boolean which is the AND of two of object's fields
[英]Why JPQL ignore parent's fields?
应用程序堆栈: Hibernate
, Spring Data
, JPA
。
应用程序中有一些实体。 我尝试在我的 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.