小编Kaw*_*awu的帖子

JPA Criteria API:LEFT JOIN用于可选关系

我第一次使用Criteria API.它是关于抽象通用构建器的查询:

public TypedQuery<T> newQuery( Manager<?,T> manager )
{
    CriteriaBuilder builder = this.entityManager.getCriteriaBuilder();

    Class<T> genericClass = ( Class<T> ) ( ( ParameterizedType ) manager.getClass().getGenericSuperclass() ).getActualTypeArguments()[1];

    CriteriaQuery<T> criteriaQuery = builder.createQuery( genericClass );
    Root<T> root = criteriaQuery.from( genericClass );

    ...
}
Run Code Online (Sandbox Code Playgroud)

该调用默认为实体上找到的所有关系criteriaQuery.from( genericClass );生成SQL INNER JOIN.这是一个问题,因为每个关系都为空(DB NULL或不使用外键且具有无效引用的DB)这些实体将在结果列表中丢失,从而有效地产生错误的搜索结果.

可以在此处找到一个示例:JPA Criteria query Path.get left join is it possibile

对于由此类/方法实例化的查询,我想要发生的是实体上的所有关系,这里genericClass映射为optional = true

@ManyToOne( FetchType.EAGER, optional = true )
@JoinColumn( name = "CLOSE_USER_ID", referencedColumnName = "USER_ID" )
private …
Run Code Online (Sandbox Code Playgroud)

java sql jpa criteria-api metamodel

12
推荐指数
1
解决办法
3万
查看次数

JPA:@PrimaryKeyJoinColumn(...)和@JoinColumn(...,insertable = ?, updatable =?)相同?

您是否可以从JPA规范派生,如果@PrimaryKeyJoinColumn(...)没有可插入和可更新的参数,则与之相同

@JoinColumn(..., insertable = false, updatable = false)
Run Code Online (Sandbox Code Playgroud)

要么

@JoinColumn(...,insertable = true,updatable = true)

当用于常规(非继承)关联时?他们应该可以互换吗?设置的可插入和可更新属性是什么?它们是否适合任何东西?请注意,我只是针对两者(似乎)实现的只读属性...

我与EclipseLink和Hibernate的映射异常相当不一致......

这是@PrimaryKeyJoinColumnJavaEE 5 + 6 Javadoc:

PrimaryKeyJoinColumn(JavaEE 5)
PrimaryKeyJoinColumn(JavaEE 6)

引用:

...它可以用在OneToOne映射中,其中引用实体的主键用作引用实体的外键.

java mapping jpa primary-key jpa-2.0

11
推荐指数
1
解决办法
2万
查看次数

JPA支持@ManyToMany(mappedBy = ...)+ @OrderColumn吗?

我有一个实体映射如下:

@Entity
@Table(name = "Groups")
@IdClass(value = GroupId.class)
public class Group implements Serializable
{
    @Id
    @Column(name = "round_id")
    private Integer roundId;

    @Id
    @Column(name = "ordinal_nbr")
    private Integer ordinalNbr = 0;

    ...
}
Run Code Online (Sandbox Code Playgroud)

它有一个复合键,(round_id, ordinal_nbr)用于指示一轮中组的顺序.

现在假设一个连接表包含通过自引用(从组到组)链接有序组的实体:

CREATE TABLE GroupLinks
(
  parent_round_id INTEGER NOT NULL,
  parent_ordinal_nbr SMALLINT NOT NULL,
  child_round_id INTEGER NOT NULL,
  child_ordinal_nbr SMALLINT NOT NULL,
  PRIMARY KEY (parent_round_id, parent_ordinal_nbr, child_round_id, child_ordinal_nbr),
  FOREIGN KEY (parent_round_id, parent_ordinal_nbr) REFERENCES Groups (round_id, ordinal_nbr),
  FOREIGN KEY (child_round_id, child_ordinal_nbr) REFERENCES Groups (round_id, ordinal_nbr)
); …
Run Code Online (Sandbox Code Playgroud)

many-to-many hibernate jpa eclipselink

11
推荐指数
1
解决办法
9604
查看次数

Hibernate应该能够处理重叠的外键吗?

我有一个表有两个外键到两个不同的表,两个外键共享一列:

CREATE TABLE ZipAreas
(
  country_code CHAR(2) NOT NULL,
  zip_code VARCHAR(10) NOT NULL,
  state_code VARCHAR(5) NOT NULL,
  city_name VARCHAR(100) NOT NULL,
  PRIMARY KEY (country_code, zip_code, state_code, city_name),
  FOREIGN KEY (country_code, zip_code) REFERENCES Zips (country_code, code),
  FOREIGN KEY (country_code, state_code, city_name) REFERENCES Cities (country_code, state_code, name)
)
Run Code Online (Sandbox Code Playgroud)

如您所见,有两个FK共享country_code(巧合地引用了引用路径末尾的同一列).实体类看起来像(JPA 1.0 @IdClass):

@Entity
@Table(name = "ZipAreas")
@IdClass(value = ZipAreaId.class)
public class ZipArea implements Serializable
{
    @Id
    @Column(name = "country_code", insertable = false, updatable = false)
    private String countryCode;

    @Id
    @Column(name = …
Run Code Online (Sandbox Code Playgroud)

hibernate jpa foreign-keys composite-key overlapping

10
推荐指数
3
解决办法
9208
查看次数

JSF EL:保留的实例但尚未实现?

我在JSF EL中找到了instanceof运算符,但它在使用时会引发异常.它显然是保留但没有实现?什么时候(可能)可用,如果还没有比我现在使用的JSF 1.2更新的版本?

jsf el instanceof

10
推荐指数
1
解决办法
4282
查看次数

Hibernate 4:持久化InheritanceType.JOINED鉴别器列值

我有一个简单的JOINED文档层次结构:

CREATE TABLE Documents
(
  id INTEGER NOT NULL,
  discriminator ENUM('official','individual','external') NOT NULL,
  file_name VARCHAR(200) NOT NULL,
  PRIMARY KEY (id)
);

CREATE SystemDocuments
(
  id INTEGER NOT NULL,
  binary_data BLOB NOT NULL,
  PRIMARY KEY (id),
  FOREIGN KEY (id) REFERENCES Documents (id)
);

CREATE ExternalDocuments
(
  id INTEGER NOT NULL,
  PRIMARY KEY (id),
  FOREIGN KEY (id) REFERENCES SystemDocuments (id)
);
Run Code Online (Sandbox Code Playgroud)

如您所见,所有子表都与Documents表共享相同的ID.除此之外,SystemDocuments添加一binary_data列并且不ExternalDocuments添加任何新属性.(还要注意有层次结构中表示为其他两个具体子表'official''individual'它在这里是没有意义的.)

以下是上表的映射:

Document.java:

@Entity
@Table(name = "Documents")
@Inheritance(strategy = InheritanceType.JOINED) …
Run Code Online (Sandbox Code Playgroud)

java inheritance hibernate jpa discriminator

10
推荐指数
1
解决办法
2万
查看次数

代理的原始类名(无需手动字符串操作)

在Java中,如何获取Java EE(CDI)代理的原始类对象和/或类名?

getName()代理实例上使用时,返回的名称就像

com.company.employeemgmt.EmployeeManager$Proxy$_$$_WeldSubclass
Run Code Online (Sandbox Code Playgroud)

Java SE(7)或EE(6)中是否有一些功能可以返回原始的,未经过代理的类实例或其名称?

我需要:

com.company.employeemgmt.EmployeeManager
Run Code Online (Sandbox Code Playgroud)

当然,我可以简单地使用字符串操作,但我想知道这些功能是否已经是Java-(EE)-inbuilt.

我已经找到了java.reflect.Proxy,我可以用来检测代理:

public static void doSomething( Class<? implements Serializable> managerClass )
{
    if ( Proxy.isProxyClass( managerClass ) )
    {
        // unproxy how?
        managerClass = managerClass.getUnproxiedClass();
    }

    // delegate
    doSomething( managerClass.getName() );
}


public static void doSomething( String prefix )
{
    // do real work
    ...
}
Run Code Online (Sandbox Code Playgroud)

...,但你怎么解除原来的课程呢?

更新:

诀窍是访问MyUtil.doSomething( EmployeeManager.class )(或 MyUtil.doSomething( EmployeeManager.class.getName() )),但我想使用/传递MyUtil.doSomething( this.getClass() )(或 MyUtil.doSomething( this.getClass().getName() ))来自所有客户端,因为这些代码可以被复制而无需手动更改.

java proxy class java-ee cdi

10
推荐指数
2
解决办法
4420
查看次数

JPQL:将Long转换为String以执行LIKE搜索

我有以下JPQL查询:

SELECT il
FROM InsiderList il
WHERE ( il.deleteFlag IS NULL OR il.deleteFlag = '0' )
  AND il.clientId = :clientId
  AND (    LOWER( il.name ) LIKE :searchTerm
        OR il.nbr LIKE :searchTerm
        OR LOWER( il.type ) LIKE :searchTerm
        OR LOWER( il.description ) LIKE :searchTerm )
Run Code Online (Sandbox Code Playgroud)

客户希望我们能够搜索该nbr字段,这是一个java.lang.Long.

:

如何java.lang.Long使用JPQL 执行LIKE搜索?

java jpa jpql long-integer sql-like

9
推荐指数
1
解决办法
8101
查看次数

关于LAZY加载的Hibernate 4 ClassCastException,而EAGER正常工作

我为地理区域(如大洲,国家,州等)提供了以下JOINED继承根实体:

@Entity
@Table(name = "GeoAreas")
@Inheritance(strategy = InheritanceType.JOINED)
public abstract class GeoArea implements Serializable
{
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column
    protected Integer id;

    @Column
    protected String name;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "parent_id", referencedColumnName = "id")
    protected GeoArea parent;

    ...
}
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,地理区域有一个简单的自动ID,如PK,名称以及与其父级的关系(自引用).请注意parent映射为的地理区域关系FetchType.LAZY.在数据库中,FK parent_id正在NOT NULL使关系成为可选的.默认为@ManyToOneis optional = true,因此映射似乎是正确的.

子类定义了其他属性,实际上并不重要.数据库中的数据正确链接,因为可以通过JPQL列出地理区域而没有问题(FetchType.EAGER映射略有不同parent,请参见文本结尾):

竞技场列表与EAGER加载

每一行都是以下的实例:

public class ArenaListViewLine
{
    private final Integer arenaId;
    private final String arenaName;
    private final String arenaLabel;

    private …
Run Code Online (Sandbox Code Playgroud)

hibernate jpa lazy-loading classcastexception hibernate-4.x

8
推荐指数
1
解决办法
7796
查看次数

使用JSF h:outputLink生成页面锚点

简单的问题:

你如何创建一个HTML锚点

<a id="organization" />
Run Code Online (Sandbox Code Playgroud)

JSF,例如

<h:outputLink ... />
Run Code Online (Sandbox Code Playgroud)

或另一个JSF链接组件?有可能吗?

html anchor jsf jsf-2

8
推荐指数
1
解决办法
8880
查看次数