Мой код не компилируется после добавления следующего 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