use of org.hibernate.persister.collection.QueryableCollection in project hibernate-orm by hibernate.
the class AbstractEmptinessExpression method getQueryableCollection.
protected QueryableCollection getQueryableCollection(String entityName, String propertyName, SessionFactoryImplementor factory) throws HibernateException {
final PropertyMapping ownerMapping = (PropertyMapping) factory.getEntityPersister(entityName);
final Type type = ownerMapping.toType(propertyName);
if (!type.isCollectionType()) {
throw new MappingException("Property path [" + entityName + "." + propertyName + "] does not reference a collection");
}
final String role = ((CollectionType) type).getRole();
try {
return (QueryableCollection) factory.getCollectionPersister(role);
} catch (ClassCastException cce) {
throw new QueryException("collection role is not queryable: " + role);
} catch (Exception e) {
throw new QueryException("collection role not found: " + role);
}
}
use of org.hibernate.persister.collection.QueryableCollection in project hibernate-orm by hibernate.
the class OrderByTest method testInverseIndex.
@Test
@TestForIssue(jiraKey = "HHH-5732")
public void testInverseIndex() {
final CollectionPersister transactionsPersister = sessionFactory().getCollectionPersister(BankAccount.class.getName() + ".transactions");
assertTrue(transactionsPersister.isInverse());
Session s = openSession();
s.getTransaction().begin();
BankAccount account = new BankAccount();
account.addTransaction("zzzzz");
account.addTransaction("aaaaa");
account.addTransaction("mmmmm");
s.save(account);
s.getTransaction().commit();
s.close();
s = openSession();
s.getTransaction().begin();
try {
final QueryableCollection queryableCollection = (QueryableCollection) transactionsPersister;
SimpleSelect select = new SimpleSelect(getDialect()).setTableName(queryableCollection.getTableName()).addColumn("code").addColumn("transactions_index");
PreparedStatement preparedStatement = ((SessionImplementor) s).getJdbcCoordinator().getStatementPreparer().prepareStatement(select.toStatementString());
ResultSet resultSet = ((SessionImplementor) s).getJdbcCoordinator().getResultSetReturn().extract(preparedStatement);
Map<Integer, String> valueMap = new HashMap<Integer, String>();
while (resultSet.next()) {
final String code = resultSet.getString(1);
assertFalse("code column was null", resultSet.wasNull());
final int indx = resultSet.getInt(2);
assertFalse("List index column was null", resultSet.wasNull());
valueMap.put(indx, code);
}
assertEquals(3, valueMap.size());
assertEquals("zzzzz", valueMap.get(0));
assertEquals("aaaaa", valueMap.get(1));
assertEquals("mmmmm", valueMap.get(2));
} catch (SQLException e) {
fail(e.getMessage());
} finally {
s.getTransaction().rollback();
s.close();
}
}
use of org.hibernate.persister.collection.QueryableCollection in project hibernate-orm by hibernate.
the class PersistentListTest method testInverseListIndex.
@Test
@TestForIssue(jiraKey = "HHH-5732")
public void testInverseListIndex() {
// make sure no one changes the mapping
final CollectionPersister collectionPersister = sessionFactory().getCollectionPersister(ListOwner.class.getName() + ".children");
assertTrue(collectionPersister.isInverse());
// do some creations...
Session session = openSession();
session.beginTransaction();
ListOwner root = new ListOwner("root");
ListOwner child1 = new ListOwner("c1");
root.getChildren().add(child1);
child1.setParent(root);
ListOwner child2 = new ListOwner("c2");
root.getChildren().add(child2);
child2.setParent(root);
session.save(root);
session.getTransaction().commit();
session.close();
// now, make sure the list-index column gotten written...
final Session session2 = openSession();
session2.beginTransaction();
session2.doWork(new Work() {
@Override
public void execute(Connection connection) throws SQLException {
final QueryableCollection queryableCollection = (QueryableCollection) collectionPersister;
SimpleSelect select = new SimpleSelect(getDialect()).setTableName(queryableCollection.getTableName()).addColumn("NAME").addColumn("LIST_INDEX").addCondition("NAME", "<>", "?");
PreparedStatement preparedStatement = ((SessionImplementor) session2).getJdbcCoordinator().getStatementPreparer().prepareStatement(select.toStatementString());
preparedStatement.setString(1, "root");
ResultSet resultSet = ((SessionImplementor) session2).getJdbcCoordinator().getResultSetReturn().extract(preparedStatement);
Map<String, Integer> valueMap = new HashMap<String, Integer>();
while (resultSet.next()) {
final String name = resultSet.getString(1);
assertFalse("NAME column was null", resultSet.wasNull());
final int position = resultSet.getInt(2);
assertFalse("LIST_INDEX column was null", resultSet.wasNull());
valueMap.put(name, position);
}
assertEquals(2, valueMap.size());
// c1 should be list index 0
assertEquals(Integer.valueOf(0), valueMap.get("c1"));
// c2 should be list index 1
assertEquals(Integer.valueOf(1), valueMap.get("c2"));
}
});
session2.delete(root);
session2.getTransaction().commit();
session2.close();
}
use of org.hibernate.persister.collection.QueryableCollection in project hibernate-orm by hibernate.
the class MethodNode method handleElements.
private void handleElements(FromReferenceNode collectionNode, String propertyName) {
FromElement collectionFromElement = collectionNode.getFromElement();
QueryableCollection queryableCollection = collectionFromElement.getQueryableCollection();
String path = collectionNode.getPath() + "[]." + propertyName;
LOG.debugf("Creating elements for %s", path);
fromElement = collectionFromElement;
if (!collectionFromElement.isCollectionOfValuesOrComponents()) {
getWalker().addQuerySpaces(queryableCollection.getElementPersister().getQuerySpaces());
}
setDataType(queryableCollection.getElementType());
selectColumns = collectionFromElement.toColumns(fromElement.getTableAlias(), propertyName, inSelect);
}
use of org.hibernate.persister.collection.QueryableCollection in project hibernate-orm by hibernate.
the class AttributeNodeImpl method internalMakeKeySubgraph.
@SuppressWarnings("unchecked")
private <X> SubgraphImpl<X> internalMakeKeySubgraph(Class<X> type) {
if (!attribute.isCollection()) {
throw new IllegalArgumentException(String.format("Non-collection attribute [%s] cannot be target of key subgraph", getAttributeName()));
}
final PluralAttributeImpl pluralAttribute = (PluralAttributeImpl) attribute;
if (pluralAttribute.getCollectionType() != PluralAttribute.CollectionType.MAP) {
throw new IllegalArgumentException(String.format("Non-Map attribute [%s] cannot be target of key subgraph", getAttributeName()));
}
final AssociationType attributeType = (AssociationType) Helper.resolveType(sessionFactory(), attribute);
final QueryableCollection collectionPersister = (QueryableCollection) attributeType.getAssociatedJoinable(sessionFactory());
final Type indexType = collectionPersister.getIndexType();
if (!indexType.isAssociationType()) {
throw new IllegalArgumentException(String.format("Map index [%s] is not an entity; cannot be target of key subgraph", getAttributeName()));
}
if (keySubgraphMap == null) {
keySubgraphMap = new HashMap<>();
}
final AssociationType indexAssociationType = (AssociationType) indexType;
final EntityPersister indexEntityPersister = (EntityPersister) indexAssociationType.getAssociatedJoinable(sessionFactory());
if (type == null) {
type = indexEntityPersister.getMappedClass();
} else {
if (!isTreatableAs(indexEntityPersister, type)) {
throw new IllegalArgumentException(String.format("Map key [%s] cannot be treated as requested type [%s] : %s", getAttributeName(), type.getName(), indexEntityPersister.getMappedClass().getName()));
}
}
final SubgraphImpl<X> subgraph = new SubgraphImpl<>(this.sessionFactory, attribute.getDeclaringType(), type);
keySubgraphMap.put(type, subgraph);
return subgraph;
}
Aggregations