Hibernate 用于计算实体子级的CriteriaQuery生成格式错误的数值常量:。错误

Hibernate 用于计算实体子级的CriteriaQuery生成格式错误的数值常量:。错误,hibernate,jpa,criteria,criteria-api,Hibernate,Jpa,Criteria,Criteria Api,我在数据库中有以下表格。在我的Java代码中,所有这些都是用Hibernate注释表示的 |LibraryItem Table | |LibraryItemId|LibraryItemTitle| |ItemListing Table | |ListingId|ChildLibrayItemId|ParentLibraryItemId| 所以基本上有图书馆的项目。每个库项可以是另一个库项的子项或父项,并且此关系

我在数据库中有以下表格。在我的Java代码中,所有这些都是用Hibernate注释表示的

|LibraryItem Table             |
|LibraryItemId|LibraryItemTitle|

|ItemListing Table                              |
|ListingId|ChildLibrayItemId|ParentLibraryItemId|
所以基本上有图书馆的项目。每个库项可以是另一个库项的子项或父项,并且此关系存储在Itemlisting表中

我正在尝试使用CriteriaBuilder方法获得特定库项的所有子项的计数。这是我的密码:

public int getNumChildren(LibraryItem libItem) {
        CriteriaBuilder builder = sessionFactory.getCriteriaBuilder();
        CriteriaQuery<Long> query = builder.createQuery(Long.class);
        Root<LibraryItem> root = query.from(LibraryItem.class);
        query.select(builder.count(root.get("itemChildren")));
        query.where(builder.equal(root.get("libraryItemId"), libItem.getLibraryItemId()));
        return Math.toIntExact(sessionFactory.getCurrentSession().createQuery(query).uniqueResult());
    }
有人能解释一下我做错了什么吗

编辑:

这是实体类。我省略了一些我认为不相关的代码:

@Entity
@Table(name = "library_item", uniqueConstraints = {
        @UniqueConstraint(columnNames={"LIBRARY_ITEM_TITLE", "LIBRARY_ID"})

})
public class LibraryItem extends DatabaseObject {

    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "hilo_sequence_generator")
    @GenericGenerator(
            name = "hilo_sequence_generator",
            strategy = "org.hibernate.id.enhanced.SequenceStyleGenerator",
            parameters = {
                    @org.hibernate.annotations.Parameter(name = "sequence_name", value = "hilo_seqeunce"),
                    @org.hibernate.annotations.Parameter(name = "initial_value", value = "1"),
                    @org.hibernate.annotations.Parameter(name = "increment_size", value = "100"),
                    @org.hibernate.annotations.Parameter(name = "optimizer", value = "hilo")
            })
    @Id
    @Column(name = "LIBRARY_ITEM_ID", unique = true, nullable = false)
    private Long libraryItemId;

    @Column(name = "LIBRARY_ITEM_TITLE", nullable = false)
    private String libraryItemTitle;

    @ManyToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
    @JoinTable(name = "ITEM_LISTING",
            joinColumns = {@JoinColumn(name = "PARENT_LIB_ITEM_ID", nullable=false)},
            inverseJoinColumns = {@JoinColumn(name="CHILD_LIB_ITEM_ID", nullable = false)})
    private Set<LibraryItem> itemChildren = new HashSet<>();

    @ManyToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL, mappedBy = "itemChildren")
    private Set<LibraryItem> itemParents = new HashSet<>();
}
@实体
@表(name=“library\u item”,uniqueConstraints={
@UniqueConstraint(columnNames={“LIBRARY\u ITEM\u TITLE”,“LIBRARY\u ID”})
})
公共类LibraryItem扩展了DatabaseObject{
@GeneratedValue(策略=GenerationType.SEQUENCE,generator=“hilo\u SEQUENCE\u generator”)
@通用生成器(
name=“hilo\u序列\u生成器”,
strategy=“org.hibernate.id.enhanced.SequenceStyleGenerator”,
参数={
@org.hibernate.annotations.Parameter(name=“sequence\u name”,value=“hilo\u sequence”),
@org.hibernate.annotations.Parameter(name=“initial_value”,value=“1”),
@org.hibernate.annotations.Parameter(name=“increment\u size”,value=“100”),
@org.hibernate.annotations.Parameter(name=“optimizer”,value=“hilo”)
})
@身份证
@列(name=“LIBRARY\u ITEM\u ID”,unique=true,nullable=false)
私人长库项目;
@列(name=“LIBRARY\u ITEM\u TITLE”,null=false)
私有字符串库名称;
@ManyToMany(fetch=FetchType.LAZY,cascade=CascadeType.ALL)
@JoinTable(name=“ITEM_LISTING”,
joinColumns={@JoinColumn(name=“PARENT_LIB_ITEM_ID”,nullable=false)},
inverseJoinColumns={@JoinColumn(name=“CHILD\u LIB\u ITEM\u ID”,nullable=false)})
private Set itemChildren=new HashSet();
@ManyToMany(fetch=FetchType.LAZY,cascade=CascadeType.ALL,mappedBy=“itemChildren”)
private Set itemParents=new HashSet();
}

您正在对多值字段使用
计数。这在JPQL中是无效的,因此在条件中也是无效的


实现这一点的方法是使用
size
函数(),它明确用于集合字段。

您也可以显示您的实体类吗?
root.get(“itemChildren”)
是一个多值字段,因为根据JPA规范,它不应该与COUNT一起使用,而是添加了实体类。不,非常确定它不是一个多值字段,事实上它不是一个字段而是一个关系。集合(
private Set itemChildren
)是一个多值字段。它有多个值!关系字段仍然是字段。你数不清。您可以在它上面使用JPA函数大小,为什么您的JPA提供程序在调用它时不将其标记为错误是另一个问题;永远不要仅仅为了期望用户必须向后调试而执行SQL,wtf是错误的。提出一个错误
@Entity
@Table(name = "library_item", uniqueConstraints = {
        @UniqueConstraint(columnNames={"LIBRARY_ITEM_TITLE", "LIBRARY_ID"})

})
public class LibraryItem extends DatabaseObject {

    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "hilo_sequence_generator")
    @GenericGenerator(
            name = "hilo_sequence_generator",
            strategy = "org.hibernate.id.enhanced.SequenceStyleGenerator",
            parameters = {
                    @org.hibernate.annotations.Parameter(name = "sequence_name", value = "hilo_seqeunce"),
                    @org.hibernate.annotations.Parameter(name = "initial_value", value = "1"),
                    @org.hibernate.annotations.Parameter(name = "increment_size", value = "100"),
                    @org.hibernate.annotations.Parameter(name = "optimizer", value = "hilo")
            })
    @Id
    @Column(name = "LIBRARY_ITEM_ID", unique = true, nullable = false)
    private Long libraryItemId;

    @Column(name = "LIBRARY_ITEM_TITLE", nullable = false)
    private String libraryItemTitle;

    @ManyToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
    @JoinTable(name = "ITEM_LISTING",
            joinColumns = {@JoinColumn(name = "PARENT_LIB_ITEM_ID", nullable=false)},
            inverseJoinColumns = {@JoinColumn(name="CHILD_LIB_ITEM_ID", nullable = false)})
    private Set<LibraryItem> itemChildren = new HashSet<>();

    @ManyToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL, mappedBy = "itemChildren")
    private Set<LibraryItem> itemParents = new HashSet<>();
}