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

Spring数据:规格

孙承弼
2023-03-14

我刚开始使用规范标准*对象,我一直在做一个简单的左连接,并将一个值与一个连接的实体属性进行比较。由于我要构建的这个查找/选择函数迟早会非常动态,我决定使用Criteria对象,而不是使用不同的参数构建不同的函数。我的真实实体有更多的属性,但我在这里分解它来简化它。

之前,我试图做我的第一步规范我有一个仓库函数,这是注释与@Query和工作正常:

@Query( "SELECT DISTINCT c FROM Competition c " +
    "LEFT JOIN c.aliases a " +
    "WHERE " +
    "(lower(a.value) = :name OR lower(c.name) = :lowerCaseName) " +
    "... and so on ")

后来,我试图建立一个忽略小写和竞争名称的规范,但我仍然无法正确地将name参数与Alias值属性进行比较...

第一实体:

@Entity
public class Competition extends AbstractEntity {

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

    @Column(nullable = false)
    private String name;

    @ManyToMany(cascade = CascadeType.MERGE)  
    @JoinTable(name="competition_name_alias", joinColumns=@JoinColumn(name="competition_id"), inverseJoinColumns=@JoinColumn(name="alias_id"))  
    private Set<Alias> aliases = new HashSet<>();

    ...
}

第二实体:

@Entity
public class Alias extends AbstractEntity {

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

    @Column(unique = true)
    private String value;

    ...
}

规范:

public static Specification<Competition> withLowerCaseName(String name) {
    return new Specification<Competition>() {
        @Override
        public Predicate toPredicate(Root<Competition> product, CriteriaQuery<?> query, CriteriaBuilder builder) {
            final List<Predicate> predicates = new ArrayList<Predicate>();

            Root<Competition> root = query.from(Competition.class);

            Subquery<Alias> subquery = query.subquery(Alias.class);
            SetJoin<Competition, Alias> aliases = root.join(Competition_.aliases);

            Predicate predicate = builder.equal(aliases.get(Alias_.value), name);
            builder.and(predicate);

            Predicate[] predicatesArray = new Predicate[predicates.size()];

            query.distinct(true);

            return builder.and(predicates.toArray(predicatesArray));
        }
    };
}

使用这个函数让我所有的竞争,似乎忽略了name参数。打开Hibernate调试/跟踪日志会显示原因。生成的sql具有唯一的where条件,其中1=1

在打开BasicBinder参数的descriptor.sql.日志记录时,也没有显示名称值...

有谁知道我做错了什么吗?


共有1个答案

解阳荣
2023-03-14

在这里找到了一个稍微不同的示例,并为我的星座更改了它。似乎有用。。。

final Subquery<Alias> aliasSubquery = query.subquery(Alias.class);
final Root<Alias> alias = aliasSubquery.from(Alias.class);
final Expression<Set<Alias>> aliases = product.get(Competition_.aliases);
aliasSubquery.select(alias);
aliasSubquery.where(builder.equal(builder.lower(alias.get(Alias.value)), lowerCaseName), builder.isMember(alias, aliases));

builder.and(builder.exists(aliasSubquery));
 类似资料:
  • 我按照本教程获得了Spring Data JPA规范:https://dzone.com/articles/using-spring-data-jpa-specification 它为我实现了这一点,但我不能调用规范方法来搜索它们。我想把它们放在我的SearchController中: 现在我想在我的SearchController(比如Controller)中调用这个方法,但我不知道如何调用。目

  • 我正在尝试开发一个具有规范和RSQL的搜索API。遵循本教程-https://www.baeldung.com/rest-api-search-language-rsql-fiql

  • 我在Spring Data JPA中有两个实体: 目标是获取与user\u id相关的所有税款: User.java 税务ayment.jva 我不想要一个太多的注释从User.java和列映射在纳税user_id。 规格等级如下: 根据我获取所有与user\u id相关的税款的目标,规范是正确的还是错误的?

  • 表规范 命名统一小写下划线 非CMF核心应用,统一带应用表前缀,如portal_ 插件表,统一带插件表前缀,如:demo_ 表默认编码utf8mb4,默认排序规则utf8mb4_general_ci 引擎统一innodb 写表注释 字段规范 命名统一小写下划线 非自增主键一定要写字段注释 数据类型尽量用数字类型,数字类型的比字符类型的要快很多。 数据类型尽量小,这里的尽量小是指在满足可以预见的未来

  • 表规范 命名统一小写下划线 非CMF核心应用,统一带应用表前缀,如portal_ 插件表,统一带插件表前缀,如:plugindemo 表默认编码utf8mb4,默认排序规则utf8mb4_general_ci 引擎统一innodb 写表注释 字段规范 命名统一小写下划线 非自增主键一定要写字段注释 数据类型尽量用数字类型,数字类型的比字符类型的要快很多。 数据类型尽量小,这里的尽量小是指在满足可以