【问题标题】:JPA exception :: path expected for joinJPA 异常 :: 预期加入的路径
【发布时间】:2015-01-30 11:17:54
【问题描述】:

获取 QuerySyntaxException :连接的预期路径。 我已经在实体中定义了路径。

@Entity
@Table( name = "datapoint_template_condition_action_map_details_map" )
@NamedQuery( name = "DatapointTemplateConditionActionMapDetailsMap.findAll", query = "SELECT d FROM DatapointTemplateConditionActionMapDetailsMap d" )
public class DatapointTemplateConditionActionMapDetailsMap implements Serializable {
private static final long serialVersionUID = 1L;

@Id
@GeneratedValue( strategy = GenerationType.IDENTITY )
@Column( name = "iddatapoint_template_condition_action_map_details_map" )
private int iddatapointTemplateConditionActionMapDetailsMap;

@Temporal( TemporalType.TIMESTAMP )
@Column( name = "creation_time" )
private Date creationTime;

@Column( name = "is_disabled" )
private boolean isDisabled;

private int sequence;

@Column( name = "user_id" )
private int userId;

@Column( name = "condition_action_map_details_id" )
private int conditionActionMapDetailId;

@Column( name = "datapoint_template_id" )
private int datapointTemplateId;

@ManyToOne( fetch = FetchType.EAGER)
@JoinColumn( name = "condition_action_map_details_id", insertable = false, updatable = false )
private ConditionActionMapDetail conditionActionMapDetail;

public DatapointTemplateConditionActionMapDetailsMap() {
}

public int getConditionActionMapDetailId() {
    return conditionActionMapDetailId;
}

public Date getCreationTime() {
    return creationTime;
}

public int getDatapointTemplateId() {
    return datapointTemplateId;
}

public int getIddatapointTemplateConditionActionMapDetailsMap() {
    return iddatapointTemplateConditionActionMapDetailsMap;
}

public int getSequence() {
    return sequence;
}

public int getUserId() {
    return userId;
}

public boolean isDisabled() {
    return isDisabled;
}

public void setConditionActionMapDetailId(int conditionActionMapDetailId) {
    this.conditionActionMapDetailId = conditionActionMapDetailId;
}

public void setCreationTime(Date creationTime) {
    this.creationTime = creationTime;
}

public void setDatapointTemplateId(int datapointTemplateId) {
    this.datapointTemplateId = datapointTemplateId;
}

public void setDisabled(boolean isDisabled) {
    this.isDisabled = isDisabled;
}

public void setIddatapointTemplateConditionActionMapDetailsMap(int iddatapointTemplateConditionActionMapDetailsMap) {
    this.iddatapointTemplateConditionActionMapDetailsMap = iddatapointTemplateConditionActionMapDetailsMap;
}

public void setSequence(int sequence) {
    this.sequence = sequence;
}

public void setUserId(int userId) {
    this.userId = userId;
}

public ConditionActionMapDetail getConditionActionMapDetail() {
    return conditionActionMapDetail;
}

public void setConditionActionMapDetail(ConditionActionMapDetail conditionActionMapDetail) {
    this.conditionActionMapDetail = conditionActionMapDetail;
}

}

@Entity
@Table( name = "condition_action_map_details" )
@NamedQuery( name = "ConditionActionMapDetail.findAll", query = "SELECT c FROM ConditionActionMapDetail c" )
public class ConditionActionMapDetail implements Serializable {
private static final long serialVersionUID = 1L;

@Id
@GeneratedValue( strategy = GenerationType.IDENTITY )
@Column( name = "idcondition_action_map_details" )
private int idconditionActionMapDetails;

@Column( name = "condition_action_map_description" )
private String conditionActionMapDescription;

@Column( name = "condition_action_map_name" )
private String conditionActionMapName;

@Temporal( TemporalType.TIMESTAMP )
@Column( name = "creation_time" )
private Date creationTime;

@Column( name = "customer_id" )
private int customerId;

@Column( name = "user_id" )
private int userId;

@Column( name = "conditions_id" )
private int conditionId;

@OneToMany(mappedBy="conditionActionMapDetail")
private List<ConditionActionMap> conditionActionMaps ;

public ConditionActionMapDetail() {
}

public String getConditionActionMapDescription() {
    return conditionActionMapDescription;
}

public String getConditionActionMapName() {
    return conditionActionMapName;
}

public int getConditionId() {
    return conditionId;
}

public Date getCreationTime() {
    return creationTime;
}

public int getCustomerId() {
    return customerId;
}

public int getIdconditionActionMapDetails() {
    return idconditionActionMapDetails;
}

public int getUserId() {
    return userId;
}

public void setConditionActionMapDescription(String conditionActionMapDescription) {
    this.conditionActionMapDescription = conditionActionMapDescription;
}

public void setConditionActionMapName(String conditionActionMapName) {
    this.conditionActionMapName = conditionActionMapName;
}

public void setConditionId(int conditionId) {
    this.conditionId = conditionId;
}

public void setCreationTime(Date creationTime) {
    this.creationTime = creationTime;
}

public void setCustomerId(int customerId) {
    this.customerId = customerId;
}

public void setIdconditionActionMapDetails(int idconditionActionMapDetails) {
    this.idconditionActionMapDetails = idconditionActionMapDetails;
}

public void setUserId(int userId) {
    this.userId = userId;
}

public List<ConditionActionMap> getConditionActionMaps() {
    return conditionActionMaps;
}

public void setConditionActionMaps(List<ConditionActionMap> conditionActionMaps) {
    this.conditionActionMaps = conditionActionMaps;
}

}

在我春天的存储库类中,我有

@Repository
public interface ActionRepository extends CrudRepository<Action, Integer> {

List<Action> findByCustomerId(int customerId);


@Query( "select camd.conditionActionMaps from DatapointTemplateConditionActionMapDetailsMap  dtcamdm  "
    + " join ConditionActionMapDetail camd "
    + " on dtcamdm.conditionActionMapDetail=camd.idconditionActionMapDetails "
    + " where dtcamdm.datapointTemplateId=:templateid and camd.conditionId=:conditionid" )
List<ConditionActionMap> findConditionActionMapForDatapointTemplateIdandConditionId(@Param( "templateid" ) int templateid,@Param( "conditionid" ) int conditionid);

// List<Action> findByActionData(String data);
// List<Action> findByActionTypeId(int typeId);

}

每次我尝试运行时都会遇到以下异常

Caused by: org.hibernate.hql.internal.ast.QuerySyntaxException: Path expected for join! [select camd.conditionActionMaps from com.vuelogix.collygo.data.entities.DatapointTemplateCo
nditionActionMapDetailsMap  dtcamdm   join ConditionActionMapDetail camd  on dtcamdm.conditionActionMapDetail=camd.idconditionActionMapDetails  where dtcamdm.datapointTemplateId=:t
emplateid and camd.conditionId=:conditionid]
    at org.hibernate.hql.internal.ast.QuerySyntaxException.convert(QuerySyntaxException.java:91)
    at org.hibernate.hql.internal.ast.ErrorCounter.throwQueryException(ErrorCounter.java:109)
    at org.hibernate.hql.internal.ast.QueryTranslatorImpl.analyze(QueryTranslatorImpl.java:284)
    at org.hibernate.hql.internal.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:206)
    at org.hibernate.hql.internal.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:158)
    at org.hibernate.engine.query.spi.HQLQueryPlan.<init>(HQLQueryPlan.java:126)
    at org.hibernate.engine.query.spi.HQLQueryPlan.<init>(HQLQueryPlan.java:88)
    at org.hibernate.engine.query.spi.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:167)
    at org.hibernate.internal.AbstractSessionImpl.getHQLQueryPlan(AbstractSessionImpl.java:301)
    at org.hibernate.internal.AbstractSessionImpl.createQuery(AbstractSessionImpl.java:236)
    at org.hibernate.internal.SessionImpl.createQuery(SessionImpl.java:1800)
    at org.hibernate.jpa.spi.AbstractEntityManagerImpl.createQuery(AbstractEntityManagerImpl.java:328)
    ... 84 more

我根据休眠文档在@ManytoOne 中添加了路径。我搜索了类似的问题,但无法解决。

【问题讨论】:

    标签: java spring hibernate jpa


    【解决方案1】:

    将查询更改为

    @Query( "select camd.conditionActionMaps from DatapointTemplateConditionActionMapDetailsMap  dtcamdm  "
             + " join dtcamdm.conditionActionMapDetail camd "
             + " where dtcamdm.datapointTemplateId=:templateid and camd.conditionId=:conditionid" )
    

    【讨论】:

    • Hibernate 中的多重连接是一个不错的选择,而不是从服务器端迭代吗?
    • 一般来说,你几乎可以在 HQL 中完成你需要的任何事情,并且在一个地方完成所有事情时代码更干净。如果您需要一些数据,可以使用join fetch,这样您需要的所有内容都可以在单个 SQL 查询中提取。当然,如果你有一个多用途查询,需要的数据取决于调用者,你可以只获取查询中最少需要的数据,然后调用者可以使用Hibernate.initialize(&lt;some lazy relation)初始化他需要的东西(如果调用者是交易内部)。
    • fetch = FetchType.LAZY 在使用 dozer / mapstruct 等进行对象映射时很难实现
    • join fetch 在 spring jpa 存储库中的多对多关系中不起作用 [stackoverflow.com/questions/18891789/…
    • 我正在考虑在 HQL 中使用 join fetch@Query 注释,您可以在 thread you linked 中看到它有效。
    猜你喜欢
    • 2018-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-21
    • 2018-11-12
    • 1970-01-01
    • 2013-04-27
    • 2017-07-22
    相关资源
    最近更新 更多