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

Spring JPA-findAll()带有示例/探针,包括相关/连接的实体

弓胜泫
2023-03-14

如何使用Spring JPA的示例查询不仅查询实体本身,而且使用findAll()查询相关实体的属性?当相关实体属性设置在探测/示例实体上时,我们所有的尝试似乎都忽略了它们。

文件指出:

属性说明符接受属性名称(例如firstname和lastname)。您可以通过将属性与点(address.city)链接在一起来导航。您还可以使用匹配选项和区分大小写对其进行调整。

然而,没有例子表明链接应该如何工作,我们使用它的尝试也没有成功。

虚构的例子

假设数据库结构具有多对多关系:

>

  • 表格:书

    • id(PK, INT)
    • 标题(varchar)
    • ...

    表:类别

    • id(PK, INT)
    • 名称
    • ...

    表:Book\u类别

    • book\u id

    书Java语言

    @Data
    @Entity
    public class Book {
        public Book () {}
        public Book(String title, List<Category> categories) {
            this.title = title;
            this.categories = categories;
        }
    
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        private long id;
    
        @NotNull
        private String title;
    
        @ManyToMany(cascade = {CascadeType.PERSIST, CascadeType.MERGE})
        @JoinTable(
            name = "book_category",
            joinColumns = {@JoinColumn(name = "book_id")},
            inverseJoinColumns = {@JoinColumn(name = "category_id")}
        )
        private List<Category> categories;
    }
    
    

    BookRepository。Java语言

    @Repository
    public class BookRepository extends JpaRepository<Book, long> {
    
    }
    

    类别Java语言

    @Data
    @Entity
    public class Category {
    
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        private long id;
    
        @NotNull
        private String name;
    }
    

    类别存储。Java语言

    @Repository
    public class CategoryRepository extends JpaRepository<Category, long> {
    
    }
    

    书本ervice.java

    public class BookService {
        @Autowired
        private BookRepository bookRepository;
    
        @Autowired
        private CategoryRepository categoryRepository;
    
        public List<Book> findByExample(String title, String category) {
            ExampleMatcher matcher = ExampleMatcher.matchingAll()
                .withMatcher("title", match -> match.contains().ignoreCase()) 
    // ### This is (probably?) the bit that's wrong - none of these made any difference        
                //.withMatcher("categories.id", match -> match.contains()) 
                //.withMatcher("categories.name", match -> match.contains().ignoreCase()) 
                //.withMatcher("categories", match -> match.contains()) 
    // ###
                .withIgnoreNullValues() // ignore unset properties when finding
                .withIgnorePaths("id"); // ignore primitives as they default to 0
    
            List<Category> matchingCategories = categoryRepository.findAllByName(category);
            Example<Book> example = Example.of(new Book(
                title, matchingCategories), matcher);
    
            return bookRepository.findAll(example)
        }
    }
    

    呼叫BookService。findByExample(…)根据标题正确过滤,但完全忽略类别。“真实”的例子更为复杂,但这提炼出了我们面临的问题;我们如何在相关表和基本表上进行筛选?

  • 共有1个答案

    时才俊
    2023-03-14

    这仅适用于ToOne关系,不适用于ToOne,就像您的情况一样:

    属性说明符接受属性名称(例如firstname和lastname)。您可以通过将属性与点(address.city)链接在一起来导航。您还可以使用匹配选项和区分大小写对其进行调整。

    我还查看了Spring数据源代码,如下所示:

    for (SingularAttribute attribute : type.getSingularAttributes()) {
    

    因此,它只使用SingularAttribute,如基本体、字符串和ToOne关系。

    所以我很担心,但你试图实现的目标似乎是不可能的。

     类似资料:
    • 问题内容: 我还没有找到任何官方文档。但是afaik,是否在没有括号的情况下使用我们的类实例化没有关系-只要不涉及参数,对吗? 要么 但是谁能告诉我性能是否有所不同?“更正确”的方法是哪一种?有任何官方文件吗? 问题答案: 性能上的任何差异将绝对可以忽略。 虽然这两种方式都很好,我个人更喜欢使用 ,因为通常情况下,一个方法 是 正在这里所说的,和PHP函数/方法调用时需要。而且,它与带有参数的实例

    • 当我执行部署并描述pod时,我看到在输出底部的'Events'下列出了以下内容: (这是令人困惑的,因为它将年龄声明为2m1s-但大于这个值-所以我不确定它为什么将这个值报告为年龄) 就绪探测随后以相同错误失败。IP号与我的pod的IP匹配,我在pod描述中的下看到了这一点: 活性和就绪探针的失败导致pod不断终止和重新启动。 该应用程序有一个默认的页面,所以我相信如果健康探测能够连接,它应该会收

    • 我有这些实体: 用户 角色 权限 一个用户有很多角色,一个角色有很多权限。 null

    • 所需实体大致如下: 这是与中间表的多对多关系: 集团 我想要实现的查询(通过Criteria API)基本上与以下JPQL相同: 我尝试按如下方式构造CriteriaQuery: 由于实体没有关联关系,我不知道如何调用join(…)方法 我必须反向声明关联,即从Group成员实体声明关联: JPA的Criteria API是否有此限制?不包含关联字段的实体如何与其他实体连接?

    • 我已经浏览了Stackoverflow一整天,寻找如何做到这一点,但我还没有成功 我正在将我制作的一个快速游戏打包成一个可执行的jar,但我没有正确地引用图像,我只是引用了文件 我的类在src default package中,我不确定应该在哪里添加映像,或者是否必须将映像添加到构建路径中,或者在最新版本的eclipse中将映像添加到构建路径中的正确方法

    • 问题内容: 该SQL语句如何转换为Propel(1.6.3)? 由于tableA和tableB不共享外键,也没有定义关系。 无法运作,因为Propel报错: “致命错误:消息’TableA表上的未知关系TableB的未捕获异常’PropelException’ 非常感谢您的帮助和提示!这是我在这里的第一篇文章,希望我还没有做错任何事情:-)(在发布之前,我已经进行了彻底的搜索!) 问题答案: 您可