Hibernate Annotation + AspectJ -> Атрибуты имен pbs в HQL - PullRequest
1 голос
/ 12 февраля 2010

Я ищу способ использовать аспекты для ввода параметров в аннотированные классы спящего режима.

Вот пользователь:

 @Entity
 public class User implements IHasCity {

     @Id
     private int id;

     private String name;

}

public interface IHasCity {

}

Вот аспект, способствующий этому пользователю

public aspect ACity {

@Column
private String IHasCity.cityName;

private String IHasCity.getCityName(){
 return this.cityName;
}

}

Теперь я хотел бы сделать запрос:

Если я делаю так:

"от пользователя", у меня нет проблем, чтобы сделать как результат.getCityName ().

Если я делаю "от пользователя, где cityName =?"это не работает ...

Это связано с размахом сторон.вместо того, чтобы связывать мое личное String cityName с «cityName» в hibernate, оно связывает его с непригодным именем intertype: что-то вроде class $ ajc $ intertype $ interface $ cityName.

У вас есть способ обойти это?изменение ассоциаций имен атрибутов hql?

Большое спасибо!

1 Ответ

1 голос
/ 12 февраля 2010

Имя IHasCity.cityName будет искажено ткацким преобразователем побайтного кода aspectj в нечто вроде: AJC $ внутриполевого $ интерфейса $ CITYNAME.

Когда вы запрашиваете спящий режим, вы должны принять это во внимание. Я думаю, вы могли бы создать помощника для этого:

session.createQuery("from User u where u." + AspectHelper.mangle(ACity.class,IHasCity.class,"cityName") + "=:cityName").setParameter(":cityName",...etc).

Они изучают стратегии искажения имен в AspectJ, чтобы дать возможность избежать этого трюка. Смотрите, что поток

...