JPA-запрос Неожиданный узел AST: = - PullRequest
0 голосов
/ 28 апреля 2018

Мой код не компилируется после добавления следующего JPQL-запроса в мой репозиторий, так как кажется, что у него есть проблема с предложением d.car c:

public interface DriverRepository extends CrudRepository<DriverDO, Long>
{

    @Query("SELECT d FROM DriverDO d JOIN d.car WHERE (d.username = :username || :username is null) "
            + "and (d.onlineStatus = :onlineStatus || :onlineStatus is null) "
            + "and (d.onlineStatus = :onlineStatus || :onlineStatus is null) "
            + "and (c.licensePlate = :licensePlate || :licensePlate is null) "
            + "and (c.rating = :rating || :rating is null) "
            + "and (c.convertible = :convertible || :convertible is null) "
            + "and (c.engineType = :engineType || :engineType is null) ")
    List<DriverDO> findDriversByAttributes(@Param("username") String username, 
            @Param("onlineStatus") OnlineStatus onlineStatus,
            @Param("licensePlate") String licensePlate,
            @Param("rating") Integer rating,
            @Param("convertible") Boolean convertible,
            @Param("engineType") EngineType engineType);
}

Я искал повсюду в Интернете, и кажется, что синтаксис, на который я подаю иск, правильный, так как я хочу присоединиться к машине в моей сущности.

Ниже приведены мои сущности:

@Entity
@Table(
    name = "driver",
    uniqueConstraints = @UniqueConstraint(name = "uc_username", columnNames = {"username"})
)
public class DriverDO
{

    @Id
    @GeneratedValue
    private Long id;

    @Column(nullable = false)
    @NotNull(message = "Username can not be null!")
    private String username;

    @Column(nullable = false)
    @NotNull(message = "Password can not be null!")
    private String password;

    @Enumerated(EnumType.STRING)
    @Column(nullable = false)
    private OnlineStatus onlineStatus;

    /** One to one relationship with car */
    @OneToOne(fetch = FetchType.EAGER, optional = true)
    @JoinColumn(name = "car_id", nullable = true)
    private CarDO car;
    ...

Автомобиль Entity:

@Entity
@Table(
    name = "car",
    uniqueConstraints = @UniqueConstraint(name = "uc_license_plate", columnNames = {"license_plate"})
)
public class CarDO {

    @Id
    @GeneratedValue
    private Long id;

    @Column(name = "license_plate", nullable = false)
    @NotNull(message = "License plate can not be null!")
    private String licensePlate;

    @Column(nullable = false)
    private Boolean convertible;

    private Integer rating;

    @Enumerated(EnumType.STRING)
    @Column(name = "engine_type", nullable = false)
    private EngineType engineType;

    @OneToOne(mappedBy = "car", fetch = FetchType.EAGER)
    private DriverDO driver;

    @ManyToOne(cascade=CascadeType.ALL, fetch = FetchType.EAGER)
    @JoinColumn(name = "manufacturer_id", nullable = false)
    private ManufacturerDO manufacturer;

    private CarDO() {
    }
    ...
}

Я пробовал множество способов построения запроса, но пока что ни один из них не работает. Я не знаю, как я смогу заставить объединение работать. Здесь я пытаюсь выполнить несколько необязательных параметров, которые я получаю в своем методе REST GET, и я пытаюсь найти параметры, которые передаются путем сопоставления, если они не равны NULL. Я не знаю, верен ли мне мой подход, но до сих пор я не могу даже заставить код для компиляции, не говоря уже о решении. Также вы можете подумать, что я допустил ошибку, сделав автомобиль в сущности водителя обнуляемым, но это требование, поскольку водитель может существовать без автомобиля, а автомобиль - без водителя, но только один автомобиль может принадлежать водителю.

Вот ошибка, которую я получаю:

Caused by: org.hibernate.hql.internal.ast.QuerySyntaxException: unexpected AST node: = near line 1, column 79 [SELECT d FROM com.mytaxi.domainobject.DriverDO d JOIN d.car WHERE (d.username = :username || :username is null) and (d.onlineStatus = :onlineStatus || :onlineStatus is null) and (d.onlineStatus = :onlineStatus || :onlineStatus is null) and (c.licensePlate = :licensePlate || :licensePlate is null) and (c.rating = :rating || :rating is null) and (c.convertible = :convertible || :convertible is null) and (c.engineType = :engineType || :engineType is null) and (c.manufacturer = :manufacturer || :manufacturer is null) ]
    at org.hibernate.hql.internal.ast.QuerySyntaxException.convert(QuerySyntaxException.java:74) ~[hibernate-core-5.2.16.Final.jar:5.2.16.Final]
    at org.hibernate.hql.internal.ast.ErrorCounter.throwQueryException(ErrorCounter.java:91) ~[hibernate-core-5.2.16.Final.jar:5.2.16.Final]
    at org.hibernate.hql.internal.ast.QueryTranslatorImpl.analyze(QueryTranslatorImpl.java:272) ~[hibernate-core-5.2.16.Final.jar:5.2.16.Final]
    at org.hibernate.hql.internal.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:189) ~[hibernate-core-5.2.16.Final.jar:5.2.16.Final]
    at org.hibernate.hql.internal.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:141) ~[hibernate-core-5.2.16.Final.jar:5.2.16.Final]
    at org.hibernate.engine.query.spi.HQLQueryPlan.<init>(HQLQueryPlan.java:115) ~[hibernate-core-5.2.16.Final.jar:5.2.16.Final]
    at org.hibernate.engine.query.spi.HQLQueryPlan.<init>(HQLQueryPlan.java:77) ~[hibernate-core-5.2.16.Final.jar:5.2.16.Final]
    at org.hibernate.engine.query.spi.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:153) ~[hibernate-core-5.2.16.Final.jar:5.2.16.Final]
    at org.hibernate.internal.AbstractSharedSessionContract.getQueryPlan(AbstractSharedSessionContract.java:553) ~[hibernate-core-5.2.16.Final.jar:5.2.16.Final]
    at org.hibernate.internal.AbstractSharedSessionContract.createQuery(AbstractSharedSessionContract.java:662) ~[hibernate-core-5.2.16.Final.jar:5.2.16.Final]
    ... 81 common frames omitted
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...