【问题标题】:JPQL : How to construct a WHERE clause?JPQL:如何构造 WHERE 子句?
【发布时间】:2012-08-08 12:00:51
【问题描述】:

我想在 JPQL 中创建一个命名查询,但我不明白它是如何工作的......

这里是我的实体:

@Entity
@NamedQueries({ 
    @NamedQuery(name = "Translation.lang", 
                query = "SELECT t FROM Translation t WHERE t.reference.id = :refId AND t.language.lang = :lang")
})
@Table(name = "T_E_TRANSLATION_TRL")
public class Translation implements java.io.Serializable {

@Id
@Column(name = "TRL_ID", unique = true, nullable = false)
@TableGenerator(name="translationSeqStore", 
    table="T_S_APP_SEQ_STORE_AST", 
    pkColumnName="AST_SEQ_NAME",
    valueColumnName = "AST_SEQ_VALUE",
    pkColumnValue = "T_E_TRANSLATION_TRL.TRL_ID", 
    allocationSize=1)
@GeneratedValue(strategy=GenerationType.TABLE, 
    generator="translationSeqStore")            
private Integer id;

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "TRL_REF_ID", nullable = false)  
private Reference reference;

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "TRL_LAN_ID", nullable = false)  
private Language language;

@Column(name = "TRL_LABEL", nullable = false, length = 4000)    
private String label;

我应该在参考和语言上使用 LEFT JOIN 来选择具有这些 id 的翻译吗?

谢谢。

【问题讨论】:

    标签: java jpa jpql


    【解决方案1】:

    我想你想要:

    SELECT t FROM Translation t join fetch t.reference join fetch t.language WHERE t.reference.id = :refId AND t.language.lang = :lang
    

    这将加入(并获取 LAZY 引用和语言)并返回 Translations 用于 ID 为 refId 的引用和 lang = lang 的语言。

    【讨论】:

    • 好吧,我真的不知道我在做什么。那么,当lazy 和join 存在时,我们必须使用“join fetch”来实现对这些条件的搜索?谢谢。
    • 您不必必须,但是当您尝试懒惰地访问它时,它避免了额外的查询来获取它...
    • oki...这确实是懒惰模式的重要元素:) 谢谢。
    • 如果元素是 Set ,如何管理它?即如何对特定元素的 Id 进行研究......这里有一个例子:@ManyToMany(fetch = FetchType.LAZY) @JoinTable(name = "T_J_MAN_AIR_MNA", joinColumns = { @JoinColumn(name = "MNA_MAN_ID", nullable = false, 可更新 = false) }, inverseJoinColumns = { @JoinColumn(name = "MNA_AIR_ID", nullable = false, 可更新 = false) }) private Set aircrafts = new HashSet(0); SELECT m FROM Manual m join fetch ?在哪里???
    • Fetching 的工作方式与 Sets 相同,join fetch m.aircrafts,对于 where 子句,您需要使用类似 EXISTS 的内容(请参阅 JPQL 语言参考)
    猜你喜欢
    • 1970-01-01
    • 2013-12-26
    • 2013-07-19
    • 2012-02-19
    • 2014-12-05
    • 2012-03-05
    • 2018-02-12
    • 1970-01-01
    • 2019-05-20
    相关资源
    最近更新 更多