Gleeb
Gleeb

Reputation: 11299

HQL select Exception on Invalid path

I am trying to issue a select from database using HQL

here is the code:

public Collection<Link> getAllLinksForDevice(Device device) {
    Session session = sessionFactory.getCurrentSession();
    String hql = "SELECT Link as l WHERE l.device1 = :deviceId OR l.device2 = :deviceId";
    Query query = session.createQuery(hql); <-- Fails here!!
    query.setParameter("deviceId",device.getId());
    Collection<Link> linkList  = query.list();
    return linkList;
}

and the link entity:

@Id
@Column(name = "id")
@GeneratedValue
private int id;

@ManyToOne
@JoinColumn(name="device1_id")
private Device device1;

@ManyToOne
@JoinColumn(name="device2_id")
private Device device2;

The device Entity:

@Entity
@Table(name = "device")
public class Device {

    @Id
    @Column(name = "id")
    @GeneratedValue
    private int id;

    @Column(name = "dns_Name")
    private String dnsName;

    @Column(name = "ip_address_v4")
    private String ipV4;

    @Column(name = "device_type")
    private int deviceType;

    @ManyToOne
    @JoinColumn(name="area_id")
    private Area area;

But I get an exception:

15:10:55,570 DEBUG ErrorCounter:51 - :0:0: unexpected end of subtree :0:0: unexpected end of subtree at org.hibernate.hql.antlr.HqlSqlBaseWalker.fromElementList(HqlSqlBaseWalker.java:3117) at org.hibernate.hql.antlr.HqlSqlBaseWalker.fromClause(HqlSqlBaseWalker.java:720) at org.hibernate.hql.antlr.HqlSqlBaseWalker.query(HqlSqlBaseWalker.java:571) at org.hibernate.hql.antlr.HqlSqlBaseWalker.selectStatement(HqlSqlBaseWalker.java:288) at org.hibernate.hql.antlr.HqlSqlBaseWalker.statement(HqlSqlBaseWalker.java:231) at org.hibernate.hql.ast.QueryTranslatorImpl.analyze(QueryTranslatorImpl.java:254) at org.hibernate.hql.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:185)

and:

15:10:55,622 ERROR PARSER:56 - Invalid path: 'l.device1' 15:10:55,628 DEBUG ErrorCounter:51 - Invalid path: 'l.device1' Invalid path: 'l.device1' at org.hibernate.hql.ast.util.LiteralProcessor.lookupConstant(LiteralProcessor.java:135) at org.hibernate.hql.ast.tree.DotNode.resolve(DotNode.java:216) at org.hibernate.hql.ast.tree.FromReferenceNode.resolve(FromReferenceNode.java:117) at org.hibernate.hql.ast.tree.FromReferenceNode.resolve(FromReferenceNode.java:113) at org.hibernate.hql.ast.HqlSqlWalker.resolve(HqlSqlWalker.java:854) at org.hibernate.hql.antlr.HqlSqlBaseWalker.expr(HqlSqlBaseWalker.java:1293) at org.hibernate.hql.antlr.HqlSqlBaseWalker.exprOrSubquery(HqlSqlBaseWalker.java:4243) at org.hibernate.hql.antlr.HqlSqlBaseWalker.comparisonExpr(HqlSqlBaseWalker.java:3722)

Upvotes: 0

Views: 10243

Answers (1)

JB Nizet
JB Nizet

Reputation: 692181

You have two syntax errors in your HQL query:

  1. There is no from clause. select Link as l where... is invalid. The proper syntax is select l from Link as l where ... or simply select l from Link l where....
  2. The device1 (and device2 field) field of the Link entity is of type Device. You can't compare it with an ID. Either you compare it with a Device instance, or you compare the ID of device1 with an ID: where l.device1 = :someDeviceInstanceContainingTheIdYouSearchFor or where l.device1.id = :someDeviceId.

Upvotes: 2

Related Questions