Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Hibernate中的JPA根get不使用IdClass属性_Hibernate_Jpa_Orm_Openjpa - Fatal编程技术网

Hibernate中的JPA根get不使用IdClass属性

Hibernate中的JPA根get不使用IdClass属性,hibernate,jpa,orm,openjpa,Hibernate,Jpa,Orm,Openjpa,我正在尝试对具有IdClass的实体执行多重选择。我无法获取作为ID一部分映射的列。很明显,我无法获取,因为标记为@Ids的列都不是hibernate正在创建的EntityType中属性的一部分,它们是IdAttributes映射的一部分 这段代码在openJPA中运行良好,但出于各种原因,我决定迁移到hibernate 失败的代码: CriteriaBuilder queryBuilder = getEntityManager().getCriteriaBuilder(); CriteriaQ

我正在尝试对具有IdClass的实体执行多重选择。我无法获取作为ID一部分映射的列。很明显,我无法获取,因为标记为@Ids的列都不是hibernate正在创建的EntityType中属性的一部分,它们是IdAttributes映射的一部分

这段代码在openJPA中运行良好,但出于各种原因,我决定迁移到hibernate

失败的代码:

CriteriaBuilder queryBuilder = getEntityManager().getCriteriaBuilder();
CriteriaQuery<Tuple> query = queryBuilder.createTupleQuery();
Root<ProductSearchFilter> productSearchFilterRoot = query.from(ProductSearchFilter.class);
query.multiselect(productSearchFilterRoot.get("productId").alias("productId"),
            productSearchFilterRoot.get("category").alias("category"),
            productSearchFilterRoot.get("name").alias("name"),
            productSearchFilterRoot.get("fdaStatus").alias("fdaStatus"));
    query.distinct(true);
我的映射设置:

@Table(name = "PRODUCT_SEARCH_FILTER")
@Entity()
@IdClass(ProductSearchFilterPK.class)
public class ProductSearchFilter {

private String source;
private String productId;
private String name;
private String category;
private String searchColumn;
private String fdaStatus;

@Column(name = "SOURCE", length = 11)
public String getSource() {
    return source;
}

public void setSource(String source) {
    this.source = source;
}

@Column(name = "PRODUCT_ID", length = 46, insertable = false, updatable = false)
@Id
public String getProductId() {
    return productId;
}

public void setProductId(String productId) {
    this.productId = productId;
}

@Column(name = "NAME", length = 510)
public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

@Column(name = "CATEGORY", length = 10)
public String getCategory() {
    return category;
}

public void setCategory(String category) {
    this.category = category;
}


@Column(name = "SEARCH_COLUMN", length = 1088, insertable = false, updatable = false)
@Id
public String getSearchColumn() {
    return searchColumn;
}

public void setSearchColumn(String searchColumn) {
    this.searchColumn = searchColumn;
}

@Column(name = "FDA_STATUS", insertable = false, updatable = false)
@Id
public String getFdaStatus() {
    return fdaStatus;
}

public void setFdaStatus(String fdaStatus) {
    this.fdaStatus = fdaStatus;
}
}



public class ProductSearchFilterPK implements Serializable {
private String productId;
private String searchColumn;
private String fdaStatus;

public String getFdaStatus() {
    return fdaStatus;
}

public void setFdaStatus(String fdaStatus) {
    this.fdaStatus = fdaStatus;
}

public String getProductId() {
    return productId;
}

public void setProductId(String productId) {
    this.productId = productId;
}

public String getSearchColumn() {
    return searchColumn;
}

public void setSearchColumn(String searchColumn) {
    this.searchColumn = searchColumn;
}
}

有一种变通方法,即使用规范元模型

不幸的是,我们从productSearchFilterRoot获得的整个模型对我们帮助不大,因为它 只给我们一个集合的视图。所以,我们不能从那个里通过属性名立即查询IdClass的属性。 但不管怎么说,它们都在那里:

//following will contain three attributes that are part of id.
Set<SingularAttribute<? super ProductSearchFilter, ?>> s = model.getIdClassAttributes();
//following will contain three attributes that are part of id.
Set<SingularAttribute<? super ProductSearchFilter, ?>> s = model.getIdClassAttributes();
@StaticMetamodel(ProductSearchFilter.class)
public abstract class ProductSearchFilter_ {
    public static volatile SingularAttribute<ProductSearchFilter, String> category;
    public static volatile SingularAttribute<ProductSearchFilter, String> fdaStatus;
    public static volatile SingularAttribute<ProductSearchFilter, String> source;
    public static volatile SingularAttribute<ProductSearchFilter, String> name;
    public static volatile SingularAttribute<ProductSearchFilter, String> searchColumn;
    public static volatile SingularAttribute<ProductSearchFilter, String> productId;
}
CriteriaBuilder queryBuilder = getEntityManager().getCriteriaBuilder();
CriteriaQuery<Tuple> query = queryBuilder.createTupleQuery();
Root<ProductSearchFilter> productSearchFilterRoot = query.from(ProductSearchFilter.class);
query.multiselect(
    productSearchFilterRoot.get(ProductSearchFilter_.productId).alias("productId"),
    productSearchFilterRoot.get(ProductSearchFilter_.category).alias("category"),
    productSearchFilterRoot.get(ProductSearchFilter_.name).alias("name"),
    productSearchFilterRoot.get(ProductSearchFilter_.fdaStatus).alias("fdaStatus"));
query.distinct(true);
productSearchFilterRoot.get("name").alias("name"),