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

我们可以用复合键属性构建Spring Data JPA规范吗

单于海荣
2023-03-14

我使用Spring数据JPA规范对实体进行一般查询。到目前为止,它运行良好。现在,当我尝试在通过embeddedId注释使用的组合键上使用这些键时,出现了问题。所以这里我需要使用一个嵌套属性来查询,比如说,如果对象是Foo,我试图在id.id1上写一个条件。

@Entity
@Data
public class Foo implements Serializable {
    private static final long serialVersionUID = 1L;
     /** The key. */
   @EmbeddedId
   private FooKey id;
}

@Embeddable
@Data
public class FooKey implements Serializable {
    private static final long serialVersionUID = 1L;
     /** The key. */

   private String id1;
   private String id2;
}

在规范中,我正在尝试

@Override
    public Predicate toPredicate(Root<T> root, CriteriaQuery<?> query, CriteriaBuilder builder) {
 // get root type 
 root.get(property).getJavaType()

但这对嵌套属性不起作用,就像在这种情况下一样。有没有什么方法可以为复合键中的属性构建谓词。

共有2个答案

曹成双
2023-03-14

如果您想使用多个级别,您可以构建这样的函数。根据我的经验,2个级别就足够了。但取决于您。

protected Path<Comparable> getPath(Root<EntityOrModel> root) {
    Path<Comparable> path;
    if (criteria.getKey().contains(".")) {
        String[] split = criteria.getKey().split("\\.");
        int keyPosition = 0;
        path = root.get(split[keyPosition]);
        for (String criteriaKeys : split) {
            if (keyPosition > 0) {
                path = path.get(criteriaKeys);
            }
            keyPosition++;
        }
    } else {
        path = root.get(criteria.getKey());
    }
    return path;
}

然后设置

@Override
public Predicate toPredicate(Root<EntityOrModel> root, CriteriaQuery<?> query, CriteriaBuilder builder) {
    Path<Comparable> path = getPath(root);
    // ...
    return builder.equal(path, value)
}
钱焕
2023-03-14

平等的例子:

     @Override
     public Predicate toPredicate(Root<Foo> root, CriteriaQuery<?> query, CriteriaBuilder builder) { 
     builder.equal(root.get("id").get("id1"),"my val");
 类似资料:
  • 我有几个单独的规则。例如,现在我有3套不同的规则要执行。根据输入参数,在任何时候都要执行一组规则。假设第一组有5条规则,第二组有7条规则,第三组有5条规则。现在,所有这些集合可能都有公共规则,我想引用它们,而不是在每个集合中编写3次规则。如何在流口水时做到这一点?明天,如果我进行了更新,我应该只能对规则进行一次更改,并且此更改应反映在所有集合中。请就此提出建议。。。。。 谢谢

  • 我有一个表,其中有3个属性作为主键产品:primary key(,,)。 现在我在另一个表中引用这个复合主键 order_details:外键(product_name,product_type,category)引用产品(product_name,product_type,category) 然而,我在控制台中得到一个错误,说缺少括号,我无法添加外键。但是,如果只在引用中添加两个列名(例如:“F

  • 问题内容: 在.properties文件中,我可以在第一个字符之后使用字符’=’吗? 像这样: 是否允许?如果确实允许,我在哪里可以知道允许? 到目前为止,它似乎仍然有效,但我不太确定它以后是否会失效。 问题答案: 您可以在和之前放置反斜杠转义字符。 或者最好使用下面的代码来打印出如何 转义 您的财产: 输出: 另外,请查看Java API信息

  • 问题内容: 假设我正在对具有7个模块的大型项目进行完整构建,而在第6个模块上,由于测试失败,构建失败。有什么方法可以从失败之处开始构建? 问题答案: 您可以使用或从第6个模块恢复构建: 从指定项目恢复反应堆 有关详细信息,请参见高级反应堆选项。

  • 问题内容: 可以说我有一个具有两列和String数据类型的表。通常我写我的hql查询像 我可以编写将两个属性都连接在一起的hql查询吗? 也许像 问题答案: 或者,如果您想要分隔符: 请参阅文档。