/*
* Copyright 2007 The Fornax Project Team, including the original
* author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.sculptor.framework.accessimpl.jpa;
import java.util.Arrays;
import java.util.List;
import org.sculptor.framework.accessapi.FindAllAccess2;
import org.sculptor.framework.domain.Property;
/**
* <p>
* Find all entities of a specific type. Implementation of Access command
* FindAllAccess.
* </p>
* <p>
* Command design pattern.
* </p>
*/
// EclipseLink has problems with inheritance and criteria query, using jpql query works
// TODO: check reason and switch back to criteria query
public class JpaFindAllAccessImplGeneric<T,R>
// extends JpaCriteriaQueryAccessBase<T,R>
extends JpaJpqlQueryAccessBase<T,R>
implements FindAllAccess2<R> {
public JpaFindAllAccessImplGeneric() {
super();
}
public JpaFindAllAccessImplGeneric(Class<T> type) {
super(type);
}
public JpaFindAllAccessImplGeneric(Class<T> type, Class<R> resultType) {
super(type, resultType);
}
public List<R> getResult() {
return getListResult();
}
// TODO: remove all overrides if using criteria query
String orderBy = null;
@Override
protected void prepareQuery(QueryConfig config) {
super.prepareQuery(config);
StringBuffer query = new StringBuffer();
query.append("select ");
if (config.isDistinct()) {
query.append("distinct ");
}
query.append("object(e) from ").append(getType().getSimpleName()).append(" e");
Property<?>[] fetchEager = getFetchEager();
if (fetchEager != null && fetchEager.length > 0) {
for (Property<?> attr : fetchEager) {
query.append(" left join fetch e.").append(attr.getName());
}
}
setNamedQuery(false);
setQuery(query.toString());
}
@Override
protected void prepareOrderBy(String query, QueryConfig config) {
if (orderBy != null)
query += " order by " + JpaHelper.toSeparatedString(Arrays.asList(orderBy.split(",")), ",", "e.");
}
@Override
protected void prepareResultCount(QueryConfig config) {
StringBuffer query = new StringBuffer();
query.append("select ");
if (config.isDistinct()) {
query.append("distinct ");
}
query.append("count(e) from ").append(getType().getSimpleName()).append(" e");
setResultCountQuery(getEntityManager().createQuery(query.toString(), Long.class));
}
@Override
public void setOrderBy(String orderBy) {
this.orderBy = orderBy;
}
}