You can use below example to retrieve only three columns from two tables which have parent-child relatioship. If you notice in ProjectionList, i am selecting two columns from parent table and one column from child table.
Code:
Criteria ct = session.createCriteria( TableOne.class, "t_one" );
ct.add( Restrictions.eq( "t_one.propertyOne", objectOne ) );
ct.add( Restrictions.eq( "t_one.propertyTwo", objectTwo ) );
ct.createCriteria( "t_one.collectionProperty", "colls" ); // this maps to join table or TableTwo.class
ProjectionList pl = Projections.projectionList();
pl.add( Projections.property( "t_one.propertyOne" ) );
pl.add( Projections.property( "t_one.propertyThree" ) );
pl.add( Projections.property( "colls.propOne" ) );
ct.setProjection( pl );
List results = ct.list();
And you should be aware that objects in retrieved List will be Object[] array and not any persistent class.