Java 通用DAO
我正试图使用JPA实现一个通用DAO,但这种方法有一个问题:Java 通用DAO,java,jpa,dao,genericdao,Java,Jpa,Dao,Genericdao,我正试图使用JPA实现一个通用DAO,但这种方法有一个问题: public List<T> findAllByProperties( Map<String, Object> properties ) { CriteriaQuery<T> queryByProperties = createQueryByProperties( properties ); TypedQuery<T> query = em.createQuery( qu
public List<T> findAllByProperties( Map<String, Object> properties )
{
CriteriaQuery<T> queryByProperties = createQueryByProperties( properties );
TypedQuery<T> query = em.createQuery( queryByProperties );
return query.getResultList(); //(<== this line triggers the error)
}
private CriteriaQuery<T> createQueryByProperties( Map<String, Object> properties )
{
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<T> cq = cb.createQuery( entityClass );
Root<T> root = cq.from( entityClass );
Set<Entry<String, Object>> entrySet = properties.entrySet();
List<Predicate> predicateList = new ArrayList<Predicate>();
for ( Entry<String, Object> entry : entrySet )
{
String key = entry.getKey();
Object value = entry.getValue();
Predicate equal = cb.equal( root.get( key ), value );
predicateList.add( equal );
}
cq = cq.where( cb.and( predicateList.toArray( new Predicate[ predicateList.size() ] ) ) );
return cq;
}
但我得到了这个线索:
Caused by: javax.ejb.EJBException: See nested exception; nested exception is: <openjpa-2.0.0-r422266:935683 nonfatal user error> org.apache.openjpa.persistence.ArgumentException: The specified parameter of type "class [Ljava.lang.Object;" is not a valid query parameter.
Caused by: <openjpa-2.0.0-r422266:935683 nonfatal user error> org.apache.openjpa.persistence.ArgumentException: The specified parameter of type "class [Ljava.lang.Object;" is not a valid query parameter.
at org.apache.openjpa.jdbc.sql.DBDictionary.setUnknown(DBDictionary.java:1418)
at org.apache.openjpa.jdbc.sql.SQLBuffer.setParameters(SQLBuffer.java:644)
at org.apache.openjpa.jdbc.sql.SQLBuffer.prepareStatement(SQLBuffer.java:553)
at org.apache.openjpa.jdbc.sql.SQLBuffer.prepareStatement(SQLBuffer.java:529)
at org.apache.openjpa.jdbc.sql.SelectImpl.prepareStatement(SelectImpl.java:451)
at org.apache.openjpa.jdbc.sql.SelectImpl.execute(SelectImpl.java:392)
at com.ibm.ws.persistence.jdbc.sql.SelectImpl.execute(SelectImpl.java:80)
at org.apache.openjpa.jdbc.sql.SelectImpl.execute(SelectImpl.java:363)
at org.apache.openjpa.jdbc.sql.LogicalUnion$UnionSelect.execute(LogicalUnion.java:427)
at org.apache.openjpa.jdbc.sql.LogicalUnion.execute(LogicalUnion.java:230)
at org.apache.openjpa.jdbc.sql.LogicalUnion.execute(LogicalUnion.java:220)
at org.apache.openjpa.jdbc.kernel.SelectResultObjectProvider.open(SelectResultObjectProvider.java:94)
at org.apache.openjpa.kernel.QueryImpl$PackingResultObjectProvider.open(QueryImpl.java:2068)
at org.apache.openjpa.lib.rop.EagerResultList.<init>(EagerResultList.java:34)
at org.apache.openjpa.kernel.QueryImpl.toResult(QueryImpl.java:1246)
at org.apache.openjpa.kernel.QueryImpl.execute(QueryImpl.java:1005)
at org.apache.openjpa.kernel.QueryImpl.execute(QueryImpl.java:861)
at org.apache.openjpa.kernel.QueryImpl.execute(QueryImpl.java:792)
at org.apache.openjpa.kernel.DelegatingQuery.execute(DelegatingQuery.java:542)
at org.apache.openjpa.persistence.QueryImpl.execute(QueryImpl.java:288)
at org.apache.openjpa.persistence.QueryImpl.getResultList(QueryImpl.java:302)
at cl.site.project.ejb.util.dao.GenericDAO.findAllByProperties(GenericDAO.java:145)
原因:javax.ejb.EJBException:参见嵌套异常;嵌套异常为:org.apache.openjpa.persistence.ArgumentException:类型为“class[Ljava.lang.Object;”的指定参数不是有效的查询参数。
原因:org.apache.openjpa.persistence.ArgumentException:类型为“class[Ljava.lang.Object;”的指定参数不是有效的查询参数。
位于org.apache.openjpa.jdbc.sql.DBDictionary.setUnknown(DBDictionary.java:1418)
位于org.apache.openjpa.jdbc.sql.SQLBuffer.setParameters(SQLBuffer.java:644)
位于org.apache.openjpa.jdbc.sql.SQLBuffer.prepareStatement(SQLBuffer.java:553)
位于org.apache.openjpa.jdbc.sql.SQLBuffer.prepareStatement(SQLBuffer.java:529)
在org.apache.openjpa.jdbc.sql.SelectImpl.prepareStatement上(SelectImpl.java:451)
位于org.apache.openjpa.jdbc.sql.SelectImpl.execute(SelectImpl.java:392)
位于com.ibm.ws.persistence.jdbc.sql.SelectImpl.execute(SelectImpl.java:80)
位于org.apache.openjpa.jdbc.sql.SelectImpl.execute(SelectImpl.java:363)
位于org.apache.openjpa.jdbc.sql.LogicalUnion$UnionSelect.execute(LogicalUnion.java:427)
位于org.apache.openjpa.jdbc.sql.LogicalUnion.execute(LogicalUnion.java:230)
位于org.apache.openjpa.jdbc.sql.LogicalUnion.execute(LogicalUnion.java:220)
位于org.apache.openjpa.jdbc.kernel.SelectResultObjectProvider.open(SelectResultObjectProvider.java:94)
位于org.apache.openjpa.kernel.QueryImpl$packingsresultobjectprovider.open(QueryImpl.java:2068)
位于org.apache.openjpa.lib.rop.acquiredResultList。(acquiredResultList.java:34)
位于org.apache.openjpa.kernel.QueryImpl.toResult(QueryImpl.java:1246)
位于org.apache.openjpa.kernel.QueryImpl.execute(QueryImpl.java:1005)
位于org.apache.openjpa.kernel.QueryImpl.execute(QueryImpl.java:861)
位于org.apache.openjpa.kernel.QueryImpl.execute(QueryImpl.java:792)
位于org.apache.openjpa.kernel.DelegatingQuery.execute(DelegatingQuery.java:542)
位于org.apache.openjpa.persistence.QueryImpl.execute(QueryImpl.java:288)
在org.apache.openjpa.persistence.QueryImpl.getResultList(QueryImpl.java:302)上
位于cl.site.project.ejb.util.dao.GenericDAO.findAllByProperties(GenericDAO.java:145)
我希望任何人都能帮助我。我找到了一个解决办法。
见评论
public List<T> findAllByProperties( Map<String, Object> properties )
{
CriteriaQuery<T> queryByProperties = createQueryByProperties( properties );
TypedQuery<T> query = em.createQuery( queryByProperties );
// ADDING THIS
Set<String> keySet = properties.keySet();
for ( String key : keySet )
{
Object value = properties.get( key );
query.setParameter( key, value );
}
//
return query.getResultList();
}
private CriteriaQuery<T> createQueryByProperties( Map<String, Object> properties )
{
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<T> cq = cb.createQuery( entityClass );
Root<T> root = cq.from( entityClass );
Set<Entry<String, Object>> entrySet = properties.entrySet();
List<Predicate> predicateList = new ArrayList<Predicate>();
for ( Entry<String, Object> entry : entrySet )
{
String key = entry.getKey();
Object value = entry.getValue();
ParameterExpression<?> val = cb.parameter( value.getClass(), key ); // <-- Adding this line
Predicate equal = cb.equal( root.get( key ), val ); // <-- And using val instead of value
predicateList.add( equal );
}
cq = cq.where( cb.and( predicateList.toArray( new Predicate[ predicateList.size() ] ) ) );
return cq;
}
公共列表FindAllByProperty(地图属性)
{
CriteriaQuery QueryProperties=CreateQueryProperties(属性);
TypedQuery query=em.createQuery(queryProperties);
//加上这个
Set keySet=properties.keySet();
用于(字符串键:键集)
{
对象值=properties.get(键);
query.setParameter(键、值);
}
//
返回query.getResultList();
}
私有CriteriaQuery CreateQueryProperties(映射属性)
{
CriteriaBuilder cb=em.getCriteriaBuilder();
CriteriaQuery cq=cb.createQuery(entityClass);
Root=cq.from(entityClass);
Set entrySet=properties.entrySet();
列表谓词列表=新的ArrayList();
for(条目:entrySet)
{
String key=entry.getKey();
对象值=entry.getValue();
ParameterExpression val=cb.parameter(value.getClass(),key)//
public List<T> findAllByProperties( Map<String, Object> properties )
{
CriteriaQuery<T> queryByProperties = createQueryByProperties( properties );
TypedQuery<T> query = em.createQuery( queryByProperties );
// ADDING THIS
Set<String> keySet = properties.keySet();
for ( String key : keySet )
{
Object value = properties.get( key );
query.setParameter( key, value );
}
//
return query.getResultList();
}
private CriteriaQuery<T> createQueryByProperties( Map<String, Object> properties )
{
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<T> cq = cb.createQuery( entityClass );
Root<T> root = cq.from( entityClass );
Set<Entry<String, Object>> entrySet = properties.entrySet();
List<Predicate> predicateList = new ArrayList<Predicate>();
for ( Entry<String, Object> entry : entrySet )
{
String key = entry.getKey();
Object value = entry.getValue();
ParameterExpression<?> val = cb.parameter( value.getClass(), key ); // <-- Adding this line
Predicate equal = cb.equal( root.get( key ), val ); // <-- And using val instead of value
predicateList.add( equal );
}
cq = cq.where( cb.and( predicateList.toArray( new Predicate[ predicateList.size() ] ) ) );
return cq;
}