我有一个具有复合键的实体,所以我使用@Embeddable和@EmbeddedId注释.Embeddable类看起来像这样:
@Embeddable
public class DitaAdminAccountSkillPK implements Serializable {
@ManyToOne
@JoinColumn(name = "admin_id")
private DitaAdmin admin;
@ManyToOne
@JoinColumn(name = "account_id")
private DitaAccount account;
//constructor, getters, setters...
}
Run Code Online (Sandbox Code Playgroud)
以及使用它的实体:
@Entity
public class DitaAdminAccountSkill {
@EmbeddedId
private DitaAdminAccountSkillPK id;
//constructor, getters, setters...
}
Run Code Online (Sandbox Code Playgroud)
现在我想在另一个实体中映射实体,如下所示:
@OneToMany(fetch = FetchType.LAZY, mappedBy = "id.admin")
private List<DitaAdminAccountSkill> accountSkills;
Run Code Online (Sandbox Code Playgroud)
注意mappedBy ="id.admin",它使用DitaAdminAccountSkill的id字段引用DitaAdminAccountSkillPK中的admin字段.
这编译并运行得很好.但是,在eclipse中显示的错误显示: 在属性'accountSkills'中,"映射的"值'id.admin'无法解析为目标实体上的属性.
请注意,这是一个JPA问题,这意味着JPA方面正在抱怨.现在,我知道我可以使用@IdClass,但我只是想知道为什么它认为它是一个错误.或者我可能做了一些非常错误的事情?
让我直截了当.我在一个项目中使用Spring Data JPA和QueryDSL,我自己也无法弄清楚这一点.
我在静态方法中有QueryDSL谓词可以接受参数,如果参数不正确,它应该返回"空谓词":
public static BooleanExpression byWhateverId(Long whateverId) {
if(whateverId == null) return [insert magic here];
// if parameter is OK return usual predicate
return QClass.property.whateverId.eq(whateverId);
}
Run Code Online (Sandbox Code Playgroud)
现在我希望能够使用AND/OR操作符链接这些谓词:
someRepository.findAll(byWhateverId(someParam).and(bySomethingElseId(1));
Run Code Online (Sandbox Code Playgroud)
这里的问题是,此时我不知道'someParam'是否为空(当然我可以查看,但那是很多IF).我也知道我可以使用BooleanBuilder类,但这看起来也像很多不需要的代码.
有谁知道可以插入什么而不是"[在这里插入魔法]"??? 或者也许我在某处丢失某些东西......
谢谢!
我正在使用动态过滤器过滤PrimeFaces DataTables org.springframework.data.jpa.domain.Specification.我使用Spring工作.现在我想知道如何使用QueryDSL做同样的事情.
使用规范我可以javax.persistence.criteria.Root用来获取javax.persistence.criteria.Join,用于javax.persistence.criteria.Expression.as(Class<String> type)将它转换为String并最终使用javax.persistence.criteria.CriteriaBuilder.like(Expression<String> x, String pattern, char escapeChar).
我如何在QueryDSL中做同样的事情?我可以使用PathBuilder new PathBuilder<T>(clazz, "entity")(你真的必须在这里使用变量吗?我希望我的类是通用的......)然后com.mysema.query.types.path.PathBuilder.get(String property)返回新的PathBuilder而不是Expression.
如果我尝试使用com.mysema.query.types.path.PathBuilder.getString(String property)我得到java.lang.IllegalArgumentException: Parameter value [1] did not match expected type [java.lang.Integer].
似乎我失踪的那部分是演员.我很确定有人正在处理同样的事情.
谢谢.
编辑:IllegalArgumentException的堆栈跟踪
尝试在整数列中搜索文本"1" com.mysema.query.types.path.PathBuilder.getString(String property)- 这就是我需要进行强制转换的地方:
Caused by: java.lang.IllegalArgumentException: Parameter value [1] did not match expected type [java.lang.Integer]
at org.hibernate.ejb.AbstractQueryImpl.validateParameterBinding(AbstractQueryImpl.java:375)
at org.hibernate.ejb.AbstractQueryImpl.registerParameterBinding(AbstractQueryImpl.java:348)
at org.hibernate.ejb.QueryImpl.setParameter(QueryImpl.java:375)
at org.hibernate.ejb.QueryImpl.setParameter(QueryImpl.java:442)
at org.hibernate.ejb.QueryImpl.setParameter(QueryImpl.java:72)
at com.mysema.query.jpa.impl.JPAUtil.setConstants(JPAUtil.java:44)
at com.mysema.query.jpa.impl.AbstractJPAQuery.createQuery(AbstractJPAQuery.java:130)
at com.mysema.query.jpa.impl.AbstractJPAQuery.createQuery(AbstractJPAQuery.java:97)
at com.mysema.query.jpa.impl.AbstractJPAQuery.list(AbstractJPAQuery.java:240) …