我刚开始使用规范
和标准
*对象,我一直在做一个简单的左连接,并将一个值与一个连接的实体属性进行比较。由于我要构建的这个查找/选择函数迟早会非常动态,我决定使用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.日志记录时,也没有显示名称值...
有谁知道我做错了什么吗?
在这里找到了一个稍微不同的示例,并为我的星座更改了它。似乎有用。。。
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 写表注释 字段规范 命名统一小写下划线 非自增主键一定要写字段注释 数据类型尽量用数字类型,数字类型的比字符类型的要快很多。 数据类型尽量小,这里的尽量小是指在满足可以