I am implementing a Restful Web Service using Jersey. I have a package using hibernate to map the data to DB.
I am new to hibernate using DAO :
I have a method in GenericDao class :
public abstract class GenericDAO<T> extends DAOFactory {
private final Class classe;
public GenericDAO(Class classe) {
this.classe = classe;
}
public List<T> findByCriteria(List<Criterion> list) throws Exception {
Criteria criteria = getSession().createCriteria(classe);
for (int i = 0; i < list.size(); i++)
criteria.add(list.get(i));
return criteria.list();
}
}
Then I have my DAO classes like :
public class TaskDAO extends GenericDAO<Task> {
public TaskDAO() {
super(Task.class);
}
}
Then I use this method in a Service class and it works completely fine like this:
public Response get(long projectId, String username) {
List<Criterion> list = new ArrayList<Criterion>();
Criterion c = Restrictions.eq("project.id", projectId);
list.add(c);
List<Deliverable> deliverables = deliverableDAO.findByCriteria(list);
return deliverables
}
The problem is in this method in another Service class :
public Response get(String username) {
List<Criterion> list = new ArrayList<Criterion>();
Criterion c = Restrictions.eq("user.username", username);
list.add(c);
List<Task> tasks = taskDAO.findByCriteria(list);
return tasks;
}
as you see “Restrictions.eq(“project.id”, projectId)” works fine for me but “Restrictions.eq(“user.username”, username)” has a promlem maybe with ‘user.username’,
Any help?
The error in the stack trace is like:
javax.ws.rs.WebApplicationException: org.hibernate.QueryException: could not resolve property: user.username of: se.softwerk.timelog.model.Task
at se.softwerk.controller.services.TaskService.get(TaskService.java:29)
at se.softwerk.timelog.controller.TaskManager.taskList(TaskManager.java:72)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at com.sun.jersey.spi.container.JavaMethodInvokerFactory$1.invoke(JavaMethodInvokerFactory.java:60)
at com.sun.jersey.server.impl.model.method.dispatch.AbstractResourceMethodDispatchProvider$ResponseOutInvoker._dispatch(AbstractResourceMethodDispatchProvider.java:205)
at com.sun.jersey.server.impl.model.method.dispatch.ResourceJavaMethodDispatcher.dispatch(ResourceJavaMethodDispatcher.java:75)
at com.sun.jersey.server.impl.uri.rules.HttpMethodRule.accept(HttpMethodRule.java:288)
at com.sun.jersey.server.impl.uri.rules.RightHandPathRule.accept(RightHandPathRule.java:147)
at com.sun.jersey.server.impl.uri.rules.ResourceClassRule.accept(ResourceClassRule.java:108)
at com.sun.jersey.server.impl.uri.rules.RightHandPathRule.accept(RightHandPathRule.java:147)
at com.sun.jersey.server.impl.uri.rules.RootResourceClassesRule.accept(RootResourceClassesRule.java:84)
at com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:1469)
at com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:1400)
at com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1349)
at com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1339)
at com.sun.jersey.spi.container.servlet.WebComponent.service(WebComponent.java:416)
at com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:537)
at com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:708)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:224)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:169)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:928)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:987)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:539)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:298)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
Caused by: org.hibernate.QueryException: could not resolve property: user.username of: se.softwerk.timelog.model.Task
at org.hibernate.persister.entity.AbstractPropertyMapping.propertyException(AbstractPropertyMapping.java:83)
at org.hibernate.persister.entity.AbstractPropertyMapping.toColumns(AbstractPropertyMapping.java:98)
at org.hibernate.persister.entity.BasicEntityPropertyMapping.toColumns(BasicEntityPropertyMapping.java:61)
at org.hibernate.persister.entity.AbstractEntityPersister.toColumns(AbstractEntityPersister.java:1801)
at org.hibernate.loader.criteria.CriteriaQueryTranslator.getColumns(CriteriaQueryTranslator.java:522)
at org.hibernate.loader.criteria.CriteriaQueryTranslator.findColumns(CriteriaQueryTranslator.java:537)
at org.hibernate.criterion.SimpleExpression.toSqlString(SimpleExpression.java:66)
at org.hibernate.loader.criteria.CriteriaQueryTranslator.getWhereCondition(CriteriaQueryTranslator.java:419)
at org.hibernate.loader.criteria.CriteriaJoinWalker.<init>(CriteriaJoinWalker.java:123)
at org.hibernate.loader.criteria.CriteriaJoinWalker.<init>(CriteriaJoinWalker.java:92)
at org.hibernate.loader.criteria.CriteriaLoader.<init>(CriteriaLoader.java:93)
at org.hibernate.internal.SessionImpl.list(SessionImpl.java:1464)
at org.hibernate.internal.CriteriaImpl.list(CriteriaImpl.java:374)
at se.softwerk.timelog.model.dao.GenericDAO.findByCriteria(GenericDAO.java:33)
at se.softwerk.controller.services.TaskService.get(TaskService.java:24)
You need to create a join to be able to access the fields of the user of the task:
You don’t need to do it for the ID of the project of the task, because the ID of the project is stored, as a foreign key, in the task table directly.
Design note: your DAO doesn’t add much value. In particular, it doesn’t isolate the service class from the persistence API (Hibernate, in this case). You might use the Hibernate session directly in your service class, and it wouldn’t change much. Completely isolating the service class from the persistence API is useful for two main reasons: