2

我在 OneToMany 关系中有两个实体。

@Entity
public class Employee {

@Id @GeneratedValue
public long id;

public String name;

@OneToMany
public Collection<Address> addresses = new ArrayList<Address>();
...}

@Entity
public class Address {

@Id @GeneratedValue
public long id;

public String city;
...}

我想在员工字段上使用一些简单的标准来获取员工(这很好,不是问题),它应该只包含那些在其城市字段中具有“新德里”的地址(这是问题所在)。

相当于 JPA 2 中的以下内容

from Cat as cat
left join cat.kittens as kitten
    with kitten.bodyWeight > 10.0

这个问题是我实际问题的简化版本。

如果要复杂得多,我的主要问题是它有多个子实体,并且对父实体的过滤使用 sql 函数。

由于上述原因,我不能使用 HQL 或本机查询。

因此,我正在使用 EntityManager 、 CtiteriaBuilder 等在“仅 JPA 2”中寻找解决方案。

4

1 回答 1

0

EclipseLink JPA 中的过滤关系需要使用本机 API。你这样做的方式是创建一个DescriptorCustomizer

package ec.pack.z.pruebasDesarrollo;

import org.eclipse.persistence.config.DescriptorCustomizer;
import org.eclipse.persistence.descriptors.ClassDescriptor;
import org.eclipse.persistence.expressions.Expression;
import org.eclipse.persistence.expressions.ExpressionBuilder;
import org.eclipse.persistence.mappings.OneToManyMapping;

public class DC implements DescriptorCustomizer {
 @Override
 public void customize(ClassDescriptor descriptor) throws Exception {
  OneToManyMapping oneToManyMapping = (OneToManyMapping) descriptor.getMappingForAttributeName("addresses");
       Expression exp = oneToManyMapping.buildSelectionCriteria();
       ExpressionBuilder builder = exp.getBuilder();
       Expression addedExpression = builder.getField("city").equal("New Delhi");
       oneToManyMapping.setSelectionCriteria(exp.and(addedExpression));
 }
}

关于实体:

import org.eclipse.persistence.annotations.Customizer;

@Entity
@Customizer(ec.pack.z.pruebasDesarrollo.DC.class)    
public class Employee {

@Id @GeneratedValue
public long id;

public String name;

@OneToMany
public Collection<Address> addresses = new ArrayList<Address>();
...}

参考

于 2018-09-19T23:05:27.723 回答