【问题标题】:CriteriaQuery to count children of an entity produces malformed numeric constant: . errorCriteriaQuery 计算实体的子代会产生格式错误的数字常量: 。错误
【发布时间】:2018-02-14 21:37:40
【问题描述】:

我在数据库中有以下表格。在我的 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());
    }

这会产生以下错误:

java.sql.SQLSyntaxErrorException: malformed numeric constant: . in statement [select count(.) as col_0_0_ from library_item libraryite0_, ITEM_LISTING itemchildr1_, library_item libraryite2_ where libraryite0_.LIBRARY_ITEM_ID=itemchildr1_.PARENT_LIB_ITEM_ID and itemchildr1_.CHILD_LIB_ITEM_ID=libraryite2_.LIBRARY_ITEM_ID and libraryite0_.LIBRARY_ITEM_ID=4601]

有人可以向我解释一下我在这里做错了什么吗?

编辑:

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

@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<>();
}

【问题讨论】:

  • 你也能显示你的实体类吗?
  • root.get("itemChildren") 是一个多值字段?因为根据 JPA 规范,它不应该与 COUNT 一起使用
  • 添加了实体类。不,很确定它不是一个多值字段,实际上它不是一个字段而是一个关系。
  • 一个集合 (private Set&lt;LibraryItem&gt; itemChildren) 是一个多值字段。它有多重价值!关系 FIELD 仍然是 FIELD。你不能这样做。可以在上面使用JPA函数SIZE,
  • 为什么您的 JPA 提供程序在您调用它时没有将其标记为错误是另一个问题;永远不要让它执行 SQL 只是为了期望用户必须向后调试 wtf 是错误的。提出一个错误

标签: hibernate jpa criteria criteria-api


【解决方案1】:

您在多值字段上使用count。这在 JPQL 中无效,因此在 Criteria 中也是如此。

这样做的方法是利用 size 函数 (CriteriaBuilder.size),它明确用于集合字段。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-10-12
    • 1970-01-01
    • 1970-01-01
    • 2021-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多