【问题标题】:Play Ebean .orderBy() broken? Replacing character with "$ "播放 Ebean .orderBy() 坏了?用“$”替换字符
【发布时间】:2015-06-11 15:49:35
【问题描述】:

以下Ebean查找

String join = "trackToArtists.artist.artistToTags.tag.stationToTags.station";
return find
    .where()
    .eq(join, station)
    .ge(join + ".energyMin", settings.energyMin)
    .le(join + ".energyMax", settings.energyMax)
    .ge(join + ".livenessMin", settings.livenessMin)
    .le(join + ".livenessMax", settings.livenessMax)
    .ge(join + ".tempoMin", settings.tempoMin)
    .le(join + ".tempoMax", settings.tempoMax)
    .ge(join + ".acousticnessMin", settings.acousticnessMin)
    .le(join + ".acousticnessMax", settings.acousticnessMax)
    .ge(join + ".danceMin", settings.danceMin)
    .le(join + ".danceMax", settings.danceMax)
    .orderBy("trackToArtists.artist.artistToTags.score DESC")
    .setMaxRows(Util.TopN)
    .findList();

似乎生成了不正确的 SQL 查询,特别是 ORDER_BY:

Syntax error in SQL statement "SELECT DISTINCT T0.ID ... AND U6.DANCE_MAX <= ?  ORDER BY $  RACKTOARTISTS[*].ARTIST.ARTISTTOTAGS SCORE DESC 

完整的 SQL(由 Ebean 生成):

SELECT DISTINCT T0.ID C0, T0.ACTIVE C1, T0.NAME C2, T0.MD5 C3, T0.EN_TRACK_ID C4, T0.EN_SONG_ID C5, T0.LASTR C6, T0.LAST_LISTENER_COUNT C7, T0.LAST_PLAY_COUNT C8, T0.LAST_PLAY_COUNT_NORM C9, T0.MB_ID C10, T0.EN_ANALYZER_VERSION C11, T0.DURATION C12, T0.EN_DANCEABILITY C13, T0.ENNERGY C14, T0.EN_KEY C15, T0.EN_KEY_CONFIDENCE C16, T0.LOUDNESS C17, T0.LOUDNESS_NORM C18, T0.EN_MODE C19, T0.EN_MODE_CONFIDENCE C20, T0.EN_TEMPO C21, T0.EN_TEMPO_CONFIDENCE C22, T0.EN_TEMPO_NORM C23, T0.EN_TIME_SIGNATURE C24, T0.EN_TIME_SIGNATURE_CONFIDENCE C25, T0.EN_SONG_HOTNESS C26, T0.EN_SPEECHINESS C27, T0.EN_ACOUSTICNESS C28, T0.EN_LIVENESS C29, T0.ENVALENCE C30, T0.LAST_ID C31, T0.LAST_URL C32 FROM TRACK T0 JOIN TRACK_TO_ARTIST U1 ON U1.TRACK_ID = T0.ID  JOIN ARTIST U2 ON U2.ID = U1.ARTIST_ID  JOIN ARTIST_TO_TAG U3 ON U3.ARTIST_ID = U2.ID  JOIN TAG U4 ON U4.ID = U3.TAG_ID  JOIN STATION_TO_TAG U5 ON U5.TAG_ID = U4.ID  JOIN STATION U6 ON U6.ID = U5.STATION_ID  WHERE U5.STATION_ID = ?  AND U6.ENERGY_MIN >= ?  AND U6.ENERGY_MAX <= ?  AND U6.LIVENESS_MIN >= ?  AND U6.LIVENESS_MAX <= ?  AND U6.TEMPO_MIN >= ?  AND U6.TEMPO_MAX <= ?  AND U6.ACOUSTICNESS_MIN >= ?  AND U6.ACOUSTICNESS_MAX <= ?  AND U6.DANCE_MIN >= ?  AND U6.DANCE_MAX <= ?  ORDER BY $  RACKTOARTISTS[*].ARTIST.ARTISTTOTAGS SCORE DESC LIMIT 11

我什至不知道是什么导致它将“trackToArtists”解释为“$ RACKTOARTISTS”。

【问题讨论】:

  • 你能给我们看看你的sql代码吗?
  • @Error404 我添加了 Ebean 生成的完整 SQL 查询,我假设这就是您要的?如果您还需要什么,请告诉我。
  • 我的意思是原始的sql,你之前创建的sql。我从未使用过 Ebean,我只使用了一点 MySQL,但可能是 sql 上的错误。这就是我想看它的原因。
  • 我不确定你的意思。我没有创建任何 SQL,我正在用 Java 编写一个 Play 应用程序,而 ORM (Ebean) 似乎正在生成无效的 SQL。我编写了上面的 Java 代码,Ebean 将其转换为 SQL,也显示在上面。
  • 啊,好吧,很抱歉,但我想我帮不了你。我虽然这是sql的问题,但我没有看到您使用上面的代码创建了sql:S

标签: java sql orm playframework-2.3 ebean


【解决方案1】:

尝试做:

find.fetch("trackToArtists.artist.artistToTags")
    .where()
    .eq(join, station)
    .ge(join + ".energyMin", settings.energyMin)
    .le(join + ".energyMax", settings.energyMax)
    .ge(join + ".livenessMin", settings.livenessMin)
    .le(join + ".livenessMax", settings.livenessMax)
    .ge(join + ".tempoMin", settings.tempoMin)
    .le(join + ".tempoMax", settings.tempoMax)
    .ge(join + ".acousticnessMin", settings.acousticnessMin)
    .le(join + ".acousticnessMax", settings.acousticnessMax)
    .ge(join + ".danceMin", settings.danceMin)
    .le(join + ".danceMax", settings.danceMax)
    .orderBy("trackToArtists.artist.artistToTags.score DESC")
    .setMaxRows(Util.TopN)
    .findList();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-30
    • 1970-01-01
    相关资源
    最近更新 更多