createCriteriaInsertValues, createCriteriaInsertSelect, StackOverflowException

Hi dear Hibernate community!

We are using createCriteriaInsertValues, createCriteriaInsertSelect apis, and found out a problem with onConflict:

var insertIntoItem = cb.createCriteriaInsertValues(ItemEntity.class);
insertIntoItem.setInsertionTargetPaths(insertIntoItem.getTarget().get(ItemEntity_.ITEM_ID));
insertIntoItem.values(cb.values(cb.value(UUID.randomUUID())));
insertIntoItem.onConflict().onConflictDoNothing(); // The problem is here.
entityManager.unwrap(Session.class).createMutationQuery(insertIntoItem).executeUpdate();

Using of onConflict leads to StackOverflowError:

java.lang.StackOverflowError: null
	at org.hibernate.query.sqm.tree.expression.ValueBindJpaCriteriaParameter.copy(ValueBindJpaCriteriaParameter.java:18) ~[hibernate-core-6.5.3.Final.jar:6.5.3.Final]
	at org.hibernate.query.sqm.tree.insert.SqmValues.<init>(SqmValues.java:31) ~[hibernate-core-6.5.3.Final.jar:6.5.3.Final]
	at org.hibernate.query.sqm.tree.insert.SqmValues.copy(SqmValues.java:36) ~[hibernate-core-6.5.3.Final.jar:6.5.3.Final]
	at org.hibernate.query.sqm.tree.insert.SqmInsertValuesStatement.copy(SqmInsertValuesStatement.java:82) ~[hibernate-core-6.5.3.Final.jar:6.5.3.Final]
	at org.hibernate.query.sqm.tree.insert.SqmInsertValuesStatement.copy(SqmInsertValuesStatement.java:36) ~[hibernate-core-6.5.3.Final.jar:6.5.3.Final]
	at org.hibernate.query.sqm.tree.insert.SqmConflictClause.copy(SqmConflictClause.java:157) ~[hibernate-core-6.5.3.Final.jar:6.5.3.Final]
	at org.hibernate.query.sqm.tree.insert.SqmInsertValuesStatement.copy(SqmInsertValuesStatement.java:94) ~[hibernate-core-6.5.3.Final.jar:6.5.3.Final]
	at org.hibernate.query.sqm.tree.insert.SqmInsertValuesStatement.copy(SqmInsertValuesStatement.java:36) ~[hibernate-core-6.5.3.Final.jar:6.5.3.Final]
	at org.hibernate.query.sqm.tree.insert.SqmConflictClause.copy(SqmConflictClause.java:157) ~[hibernate-core-6.5.3.Final.jar:6.5.3.Final]
	at org.hibernate.query.sqm.tree.insert.SqmInsertValuesStatement.copy(SqmInsertValuesStatement.java:94) ~[hibernate-core-6.5.3.Final.jar:6.5.3.Final]
	at org.hibernate.query.sqm.tree.insert.SqmInsertValuesStatement.copy(SqmInsertValuesStatement.java:36) ~[hibernate-core-6.5.3.Final.jar:6.5.3.Final]
	at org.hibernate.query.sqm.tree.insert.SqmConflictClause.copy(SqmConflictClause.java:157) ~[hibernate-core-6.5.3.Final.jar:6.5.3.Final]
	at org.hibernate.query.sqm.tree.insert.SqmInsertValuesStatement.copy(SqmInsertValuesStatement.java:94) ~[hibernate-core-6.5.3.Final.jar:6.5.3.Final]
	at org.hibernate.query.sqm.tree.insert.SqmInsertValuesStatement.copy(SqmInsertValuesStatement.java:36) ~[hibernate-core-6.5.3.Final.jar:6.5.3.Final]
	at org.hibernate.query.sqm.tree.insert.SqmConflictClause.copy(SqmConflictClause.java:157) ~[hibernate-core-6.5.3.Final.jar:6.5.3.Final]
	at org.hibernate.query.sqm.tree.insert.SqmInsertValuesStatement.copy(SqmInsertValuesStatement.java:94) ~[hibernate-core-6.5.3.Final.jar:6.5.3.Final]
	at org.hibernate.query.sqm.tree.insert.SqmInsertValuesStatement.copy(SqmInsertValuesStatement.java:36) ~[hibernate-core-6.5.3.Final.jar:6.5.3.Final]
	at org.hibernate.query.sqm.tree.insert.SqmConflictClause.copy(SqmConflictClause.java:157) ~[hibernate-core-6.5.3.Final.jar:6.5.3.Final]
	at org.hibernate.query.sqm.tree.insert.SqmInsertValuesStatement.copy(SqmInsertValuesStatement.java:94) ~[hibernate-core-6.5.3.Final.jar:6.5.3.Final]
	at org.hibernate.query.sqm.tree.insert.SqmInsertValuesStatement.copy(SqmInsertValuesStatement.java:36) ~[hibernate-core-6.5.3.Final.jar:6.5.3.Final]

The same is reproducible for createCriteriaInsertSelect.onConflict on hibernate-core 6.5.3.Final

The workaround is to turn the copy tree off in the application props: hibernate.criteria.copy_tree=false

I’d like to ask, maybe I’m doing something wrong in the code snippet above?

Thank you.

1 Like

Seems to be a duplicate of StackOverflowError when using createCriteriaInsertSelect with onConflict in Hibernate 6.5.3+ (including 7.0.0Beta)