gpt4 book ai didi

Spring Hibernate JPA 规范

转载 作者:行者123 更新时间:2023-12-04 18:01:31 25 4
gpt4 key购买 nike

我有以下实体:

@Entity
public class Transaction implements java.io.Serializable {
private static final long serialVersionUID = 1L;

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
protected Long id;

@ElementCollection(fetch = FetchType.EAGER)
@CollectionTable(name="TRANSACTION_CONFIG", joinColumns=@JoinColumn(name="TRANSACTION_ID"))
@MapKeyColumn(name = "PROPERTY_KEY")
@Column(name = "PROPERTY_VALUE")
protected Map<String, String> properties = new HashMap<String, String>();



public Transaction() {
super();
}

public Long getId() {
return id;
}

public void setId(Long id) {
this.id = id;
}


public Map<String, String> getProperties() {
return properties;
}

public void setProperties(Map<String, String> properties) {
this.properties = properties;
}
}

我想通过它的“属性”找到一个交易。出于这个原因,我编写了以下 spring Specification 类来按其属性过滤事务。

  public static Specification<Transaction> matches(final Map<String, String> criteria) {
return new Specification<Transaction>() {
@Override
public Predicate toPredicate(Root<Transaction> root, CriteriaQuery<?> query,
CriteriaBuilder builder) {
List<Predicate> predicates = new ArrayList<Predicate>();
Path<Map<String, String>> propertiesRoot = root.join("properties");
for (String key : criteria.keySet()) {
Predicate p = builder.and(propertiesRoot.in(key), propertiesRoot.in(criteria.get(key)));
predicates.add(p);
}
return builder.isTrue(propertiesRoot.in(criteria));
}
};

但这似乎没有返回任何东西。知道我做错了什么吗?

最佳答案

尝试以下操作

public static Specification<Transaction> matches(final Map<String, String> criteria) {
return new Specification<Transaction>() {
@Override
public Predicate toPredicate(Root<Transaction> root, CriteriaQuery<?> query, CriteriaBuilder builder) {

List<Predicate> predicates = new ArrayList<>();

//you can define RIGHT or INNER join if you want
MapJoin<Transaction, String, String> propertiesRoot = root.joinMap("properties", JoinType.LEFT);

for (Map.Entry entry : criteria.entrySet()) {
Predicate predicate = builder.and(
builder.equal(propertiesRoot.key(), entry.getKey()),
builder.equal(propertiesRoot.value(), entry.getValue())
);
predicates.add(predicate);
}

Predicate[] predicatesArray = predicates.toArray(new Predicate[predicates.size()]);
return builder.and(predicatesArray);
}
};
}

或者如果你使用的是 Java8

public static Specification<Transaction> matches(final Map<String, String> criteria) {
return (root, query, builder) -> {
//you can define RIGHT or INNER join if you want
MapJoin<Transaction, String, String> propertiesRoot = root.joinMap("properties", JoinType.LEFT);

List<Predicate> predicates = criteria.entrySet().stream()
.map(entry ->
builder.and(
builder.equal(propertiesRoot.key(), entry.getKey()),
builder.equal(propertiesRoot.value(), entry.getValue())
))
.collect(Collectors.toList());

Predicate[] predicatesArray = predicates.toArray(new Predicate[predicates.size()]);
return builder.and(predicatesArray);
};
}

关于Spring Hibernate JPA 规范,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34641147/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com