永続化レイヤーがSpring Rooで生成されたJPAエンティティで構成され、永続化プロバイダーとしてHibernate、基礎となるDBとしてMySqlを使用するSpring Webアプリケーションを開発しています。
私のエンティティの中には、次のように Roo で生成されDetection
た tstampjava.util.Date
フィールドを持つクラスがあります。
entity jpa --class ~.data.Detection
...
field date --fieldName tstamp --type java.util.Date
...
finder add findDetectionsByTstampBetween
(もちろん、実行後にファインダーメソッドが選択されましたfinder list
)
私のコントローラーコードでは、私が呼び出す時点で:
List<Detection> detections = Detection.findDetectionsByTstampBetween(from, to).getResultList();
from と to は 2 つ有効ですjava.util.Date(s
)。ただし、サンプル データをテストするとき (指定された from の選択に対して、返されるリストが空にならないようにした後)、空のリストを取得し、その理由を調査しました。
Tomcat ログで、Hibernate が次の SQL を生成していることがわかりました。
Hibernate: select detection0_.id as id1_3_, ...etc..., detection0_.tstamp as tstamp4_3_ from detection detection0_ where detection0_.tstamp>=?
where 句にはAND detection0_.tstamp<=?
、他の日付範囲の制限を確認して、末尾に " " が含まれている必要があります。Detection.findDetectionsByTstampBetween(Date minTstamp, Date maxTstamp)
で生成されたメソッドを調べたところ、Detection_Roo_Finder.aj
実際には createQuery の呼び出しに「AND」が含まれています。
public static TypedQuery<Detection> Detection.findDetectionsByTstampBetween(Date minTstamp, Date maxTstamp) {
if (minTstamp == null) throw new IllegalArgumentException("The minTstamp argument is required");
if (maxTstamp == null) throw new IllegalArgumentException("The maxTstamp argument is required");
EntityManager em = Detection.entityManager();
TypedQuery<Detection> q = em.createQuery("SELECT o FROM Detection AS o WHERE o.tstamp BETWEEN :minTstamp AND :maxTstamp", Detection.class);
q.setParameter("minTstamp", minTstamp);
q.setParameter("maxTstamp", maxTstamp);
return q;
}
何が問題を引き起こす可能性がありますか?